Spaces:
Build error
Build error
| import * as _ from 'lodash-es'; | |
| 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 (!_.has(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 (!_.has(visited, v)) { | |
| dfs(v); | |
| } | |
| }); | |
| return results; | |
| } | |