mirror of https://github.com/ghostfolio/ghostfolio
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
45 lines
992 B
45 lines
992 B
export { tarjan };
|
|
|
|
function tarjan(g) {
|
|
var index = 0;
|
|
var stack = [];
|
|
var visited = {}; // node id -> { onStack, lowlink, index }
|
|
var results = [];
|
|
|
|
function dfs(v) {
|
|
var entry = (visited[v] = {
|
|
onStack: true,
|
|
lowlink: index,
|
|
index: index++,
|
|
});
|
|
stack.push(v);
|
|
|
|
g.successors(v).forEach(function (w) {
|
|
if (!Object.prototype.hasOwnProperty.call(visited, w)) {
|
|
dfs(w);
|
|
entry.lowlink = Math.min(entry.lowlink, visited[w].lowlink);
|
|
} else if (visited[w].onStack) {
|
|
entry.lowlink = Math.min(entry.lowlink, visited[w].index);
|
|
}
|
|
});
|
|
|
|
if (entry.lowlink === entry.index) {
|
|
var cmpt = [];
|
|
var w;
|
|
do {
|
|
w = stack.pop();
|
|
visited[w].onStack = false;
|
|
cmpt.push(w);
|
|
} while (v !== w);
|
|
results.push(cmpt);
|
|
}
|
|
}
|
|
|
|
g.nodes().forEach(function (v) {
|
|
if (!Object.prototype.hasOwnProperty.call(visited, v)) {
|
|
dfs(v);
|
|
}
|
|
});
|
|
|
|
return results;
|
|
}
|
|
|