mirror of
https://github.com/trekhleb/javascript-algorithms.git
synced 2025-07-07 18:10:24 +08:00
Add Tarjan's algorithm.
This commit is contained in:
@ -55,6 +55,35 @@ describe('articulationPoints', () => {
|
|||||||
]);
|
]);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should find articulation points in simple graph with back edge #2', () => {
|
||||||
|
const vertexA = new GraphVertex('A');
|
||||||
|
const vertexB = new GraphVertex('B');
|
||||||
|
const vertexC = new GraphVertex('C');
|
||||||
|
const vertexD = new GraphVertex('D');
|
||||||
|
const vertexE = new GraphVertex('E');
|
||||||
|
|
||||||
|
const edgeAB = new GraphEdge(vertexA, vertexB);
|
||||||
|
const edgeBC = new GraphEdge(vertexB, vertexC);
|
||||||
|
const edgeCD = new GraphEdge(vertexC, vertexD);
|
||||||
|
const edgeAE = new GraphEdge(vertexA, vertexE);
|
||||||
|
const edgeCE = new GraphEdge(vertexC, vertexE);
|
||||||
|
|
||||||
|
const graph = new Graph();
|
||||||
|
|
||||||
|
graph
|
||||||
|
.addEdge(edgeAB)
|
||||||
|
.addEdge(edgeAE)
|
||||||
|
.addEdge(edgeCE)
|
||||||
|
.addEdge(edgeBC)
|
||||||
|
.addEdge(edgeCD);
|
||||||
|
|
||||||
|
const articulationPointsSet = articulationPoints(graph);
|
||||||
|
|
||||||
|
expect(articulationPointsSet).toEqual([
|
||||||
|
vertexC,
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
|
||||||
it('should find articulation points in graph', () => {
|
it('should find articulation points in graph', () => {
|
||||||
const vertexA = new GraphVertex('A');
|
const vertexA = new GraphVertex('A');
|
||||||
const vertexB = new GraphVertex('B');
|
const vertexB = new GraphVertex('B');
|
||||||
|
@ -14,7 +14,7 @@ class VisitMetadata {
|
|||||||
|
|
||||||
// We need this in order to check graph root node, whether it has two
|
// We need this in order to check graph root node, whether it has two
|
||||||
// disconnected children or not.
|
// disconnected children or not.
|
||||||
this.childrenCount = 0;
|
this.independantChildrenCount = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -57,7 +57,7 @@ export default function articulationPoints(graph) {
|
|||||||
visitedSet[previousVertex.getKey()].childVertex = currentVertex;
|
visitedSet[previousVertex.getKey()].childVertex = currentVertex;
|
||||||
|
|
||||||
// Update children counter for previous vertex.
|
// Update children counter for previous vertex.
|
||||||
visitedSet[previousVertex.getKey()].childrenCount += 1;
|
visitedSet[previousVertex.getKey()].independantChildrenCount += 1;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
/**
|
/**
|
||||||
@ -71,7 +71,7 @@ export default function articulationPoints(graph) {
|
|||||||
// 2. If its visited time is <= low time of adjacent vertex.
|
// 2. If its visited time is <= low time of adjacent vertex.
|
||||||
if (currentVertex === startVertex) {
|
if (currentVertex === startVertex) {
|
||||||
// Check that it has at least two independent children.
|
// Check that it has at least two independent children.
|
||||||
if (visitedSet[currentVertex.getKey()].childrenCount >= 2) {
|
if (visitedSet[currentVertex.getKey()].independantChildrenCount >= 2) {
|
||||||
articulationPointsSet.push(currentVertex);
|
articulationPointsSet.push(currentVertex);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
Reference in New Issue
Block a user