08-27-周三_17-09-29
This commit is contained in:
47
node_modules/graphlib/lib/alg/tarjan.js
generated
vendored
Normal file
47
node_modules/graphlib/lib/alg/tarjan.js
generated
vendored
Normal file
@@ -0,0 +1,47 @@
|
||||
var _ = require("../lodash");
|
||||
|
||||
module.exports = 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;
|
||||
}
|
Reference in New Issue
Block a user