Add graph.

This commit is contained in:
Oleksii Trekhleb
2018-04-10 11:42:32 +03:00
parent 840635e613
commit 67cdad8030
8 changed files with 426 additions and 1 deletions

View File

@@ -0,0 +1,88 @@
export default class Graph {
/**
* @param isDirected {boolean}
*/
constructor(isDirected = false) {
this.vertices = {};
this.isDirected = isDirected;
}
/**
* @param newVertex {GraphVertex}
* @returns {Graph}
*/
addVertex(newVertex) {
this.vertices[newVertex.getKey()] = newVertex;
return this;
}
/**
* @param vertexKey {string}
* @returns GraphVertex
*/
getVertexByKey(vertexKey) {
return this.vertices[vertexKey];
}
/**
* @param edge {GraphEdge}
* @returns {Graph}
*/
addEdge(edge) {
// Try to find and end start vertices.
let startVertex = this.getVertexByKey(edge.startVertex.getKey());
let endVertex = this.getVertexByKey(edge.endVertex.getKey());
// Insert start vertex if it wasn't inserted.
if (!startVertex) {
this.addVertex(edge.startVertex);
startVertex = this.getVertexByKey(edge.startVertex.getKey());
}
// Insert end vertex if it wasn't inserted.
if (!endVertex) {
this.addVertex(edge.endVertex);
endVertex = this.getVertexByKey(edge.endVertex.getKey());
}
// @TODO: Check if edge has been already added.
// Add edge to the vertices.
if (this.isDirected) {
// If graph IS directed then add the edge only to start vertex.
startVertex.addEdge(edge);
} else {
// If graph ISN'T directed then add the edge to both vertices.
startVertex.addEdge(edge);
endVertex.addEdge(edge);
}
return this;
}
/**
* @param startVertex {GraphVertex}
* @param endVertex {GraphVertex}
*/
findEdge(startVertex, endVertex) {
const vertex = this.getVertexByKey(startVertex.getKey());
return vertex.findEdge(endVertex);
}
/**
* @param vertexKey {string}
* @returns {GraphVertex}
*/
findVertexByKey(vertexKey) {
if (this.vertices[vertexKey]) {
return this.vertices[vertexKey];
}
return null;
}
toString() {
return Object.keys(this.vertices).toString();
}
}