Graphs
Opened this issue · 0 comments
zhorton34 commented
class Edge {
constructor(start, end, weight = null) {
this.start = start;
this.end = end;
this.weight = weight;
}
}
class Vertex {
constructor(data) {
this.data = data;
this.edges = [];
}
addEdge(vertex, weight) {
if (vertex instanceof Vertex) {
this.edges.push(new Edge(this, vertex, weight));
} else {
throw new Error('Edge start and end must both be Vertex');
}
}
removeEdge(vertex) {
this.edges = this.edges.filter(edge => edge.end !== vertex);
}
print() {
const edgeList = this.edges.map(edge =>
edge.weight !== undefined ? `${edge.end.data} (${edge.weight})` : edge.end.data) || [];
const output = `${this.data} --> ${edgeList.join(', ')}`;
console.log(output);
}
}
class Graph {
constructor(isWeighted = false, isDirected = false) {
this.vertices = [];
this.isWeighted = isWeighted;
this.isDirected = isDirected;
}
addVertex(data) {
const newVertex = new Vertex(data);
this.vertices.push(newVertex);
return newVertex;
}
removeVertex(vertex) {
this.vertices = this.vertices.filter(v => v !== vertex);
}
addEdge(vertexOne, vertexTwo, weight) {
const edgeWeight = this.isWeighted ? weight : null;
if (vertexOne instanceof Vertex && vertexTwo instanceof Vertex) {
if (this.isDirected === false) {
vertexOne.addEdge(vertexTwo, edgeWeight);
vertexTwo.addEdge(vertexOne, edgeWeight);
} else {
vertexOne.addEdge(vertexTwo, edgeWeight);
}
} else {
throw new Error('Expected Vertex arguments.');
}
}
removeEdge(vertexOne, vertexTwo) {
if (vertexOne instanceof Vertex && vertexTwo instanceof Vertex) {
if (this.isDirected === false) {
vertexOne.removeEdge(vertexTwo);
vertexTwo.removeEdge(vertexOne);
} else {
vertexOne.removeEdge(vertexTwo);
}
} else {
throw new Error('Expected Vertex arguments.');
}
}
print() {
this.vertices.forEach(vertex => vertex.print());
}
}