Data update
This commit is contained in:
parent
4d5544505c
commit
4924dd0264
3073 changed files with 55820 additions and 4408 deletions
83
Task/Tarjan/JavaScript/tarjan.js
Normal file
83
Task/Tarjan/JavaScript/tarjan.js
Normal file
|
|
@ -0,0 +1,83 @@
|
|||
class Graph {
|
||||
constructor(size) {
|
||||
this.adjacencyLists = [];
|
||||
this.vertices = [];
|
||||
this.index = 0;
|
||||
this.stack = [];
|
||||
this.numbers = new Map();
|
||||
this.lowlinks = new Map();
|
||||
this.stronglyConnectedComponents = [];
|
||||
|
||||
for (let i = 0; i < size; i++) {
|
||||
this.vertices.push(i);
|
||||
this.adjacencyLists.push(new Set());
|
||||
}
|
||||
}
|
||||
|
||||
addDirectedEdge(from, to) {
|
||||
this.adjacencyLists[from].add(to);
|
||||
}
|
||||
|
||||
getSCC() {
|
||||
for (const vertex of this.vertices) {
|
||||
if (!this.numbers.has(vertex)) {
|
||||
this.stronglyConnect(vertex);
|
||||
}
|
||||
}
|
||||
|
||||
return this.stronglyConnectedComponents;
|
||||
}
|
||||
|
||||
stronglyConnect(vertex) {
|
||||
this.numbers.set(vertex, this.index);
|
||||
this.lowlinks.set(vertex, this.index);
|
||||
this.index += 1;
|
||||
this.stack.push(vertex);
|
||||
|
||||
for (const adjacent of this.adjacencyLists[vertex]) {
|
||||
if (!this.numbers.has(adjacent)) {
|
||||
this.stronglyConnect(adjacent);
|
||||
this.lowlinks.set(vertex, Math.min(this.lowlinks.get(vertex), this.lowlinks.get(adjacent)));
|
||||
} else if (this.stack.includes(adjacent)) {
|
||||
this.lowlinks.set(vertex, Math.min(this.lowlinks.get(vertex), this.numbers.get(adjacent)));
|
||||
}
|
||||
}
|
||||
|
||||
if (this.lowlinks.get(vertex) === this.numbers.get(vertex)) {
|
||||
const stronglyConnectedComponent = new Set();
|
||||
let top;
|
||||
do {
|
||||
top = this.stack.pop();
|
||||
stronglyConnectedComponent.add(top);
|
||||
} while (top !== vertex);
|
||||
|
||||
this.stronglyConnectedComponents.push(stronglyConnectedComponent);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Main function equivalent
|
||||
function main() {
|
||||
const graph = new Graph(8);
|
||||
|
||||
graph.addDirectedEdge(0, 1);
|
||||
graph.addDirectedEdge(1, 2);
|
||||
graph.addDirectedEdge(1, 7);
|
||||
graph.addDirectedEdge(2, 3);
|
||||
graph.addDirectedEdge(2, 6);
|
||||
graph.addDirectedEdge(3, 4);
|
||||
graph.addDirectedEdge(4, 2);
|
||||
graph.addDirectedEdge(4, 5);
|
||||
graph.addDirectedEdge(6, 3);
|
||||
graph.addDirectedEdge(6, 5);
|
||||
graph.addDirectedEdge(7, 0);
|
||||
graph.addDirectedEdge(7, 6);
|
||||
|
||||
console.log("The strongly connected components are: ");
|
||||
for (const component of graph.getSCC()) {
|
||||
console.log(component);
|
||||
}
|
||||
}
|
||||
|
||||
// Run the main function
|
||||
main();
|
||||
Loading…
Add table
Add a link
Reference in a new issue