UNPKG

path-scc

Version:

Find all strongly-connected components in a graph structure.

65 lines 5.55 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); function scc(nodes, links) { var index = makeIndex(nodes); var done = []; var preOrder = []; var S = []; var P = []; var C = 0; var components = []; function edges(v) { var node = nodes[v]; return links.filter(function (l) { return l.source === node.id; }).map(function (l) { return index[l.target]; }); } function process(v) { // 1. Set the preorder number of v to C, and increment C. preOrder[v] = C++; // 2. Push v onto S and also onto P. S.push(v); P.push(v); // 3. For each edge from v to a neighboring vertex w: for (var _i = 0, _a = edges(v); _i < _a.length; _i++) { var w = _a[_i]; // If the preorder number of w has not yet been assigned, recursively search w; if (preOrder[w] === undefined) process(w); // Otherwise, if w has not yet been assigned to a strongly connected component: // Repeatedly pop vertices from P until the top element of P has a preorder number // less than or equal to the preorder number of w. if (!done[w]) { while (preOrder[P[P.length - 1]] > preOrder[w]) { P.pop(); } } } // 4. If v is the top element of P: if (v === P[P.length - 1]) { // Pop vertices from S until v has been popped, and assign the popped vertices to a new component. var component = []; do { var x = S.pop(); done[x] = true; component.push(x); } while (component[component.length - 1] !== v); components.push(component); // Pop v from P. P.pop(); } } for (var i = 0; i < nodes.length; i++) { if (preOrder[i] === undefined) process(i); index[nodes[i].id] = i; } return components.map(function (c) { return c.map(function (x) { return nodes[x]; }); }); } exports.scc = scc; function makeIndex(nodes) { var index = {}; for (var i = 0; i < nodes.length; i++) { index[nodes[i].id] = i; } return index; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic2NjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBSUEsYUFBa0UsS0FBYSxFQUFFLEtBQWE7SUFDNUYsSUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQzlCLElBQU0sSUFBSSxHQUFjLEVBQUUsQ0FBQTtJQUMxQixJQUFNLFFBQVEsR0FBYSxFQUFFLENBQUE7SUFDN0IsSUFBTSxDQUFDLEdBQWEsRUFBRSxDQUFBO0lBQ3RCLElBQU0sQ0FBQyxHQUFhLEVBQUUsQ0FBQTtJQUN0QixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDVCxJQUFNLFVBQVUsR0FBZSxFQUFFLENBQUE7SUFFakMsZUFBZSxDQUFTO1FBQ3RCLElBQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUNyQixNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLEVBQUUsRUFBcEIsQ0FBb0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQWYsQ0FBZSxDQUFDLENBQUE7SUFDMUUsQ0FBQztJQUVELGlCQUFpQixDQUFTO1FBQ3hCLHlEQUF5RDtRQUN6RCxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUE7UUFDakIsb0NBQW9DO1FBQ3BDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDVCxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ1QscURBQXFEO1FBQ3JELEdBQUcsQ0FBQyxDQUFZLFVBQVEsRUFBUixLQUFBLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBUixjQUFRLEVBQVIsSUFBUTtZQUFuQixJQUFNLENBQUMsU0FBQTtZQUNWLCtFQUErRTtZQUMvRSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDO2dCQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUN6QywrRUFBK0U7WUFDL0Usa0ZBQWtGO1lBQ2xGLGtEQUFrRDtZQUNsRCxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2IsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDL0MsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFBO2dCQUNULENBQUM7WUFDSCxDQUFDO1NBQ0Y7UUFDRCxtQ0FBbUM7UUFDbkMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxQixrR0FBa0c7WUFDbEcsSUFBTSxTQUFTLEdBQWEsRUFBRSxDQUFBO1lBQzlCLEdBQUcsQ0FBQztnQkFDRixJQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFHLENBQUE7Z0JBQ2xCLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUE7Z0JBQ2QsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUNuQixDQUFDLFFBQVEsU0FBUyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFDO1lBQy9DLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUE7WUFDMUIsZ0JBQWdCO1lBQ2hCLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQTtRQUNULENBQUM7SUFDSCxDQUFDO0lBRUQsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDdEMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQztZQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUN6QyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUN4QixDQUFDO0lBRUQsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFSLENBQVEsQ0FBQyxFQUFwQixDQUFvQixDQUFDLENBQUE7QUFDbEQsQ0FBQztBQXRERCxrQkFzREM7QUFFRCxtQkFBbUIsS0FBaUI7SUFDbEMsSUFBTSxLQUFLLEdBQTJCLEVBQUUsQ0FBQTtJQUN4QyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUN0QyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUN4QixDQUFDO0lBQ0QsTUFBTSxDQUFDLEtBQUssQ0FBQTtBQUNkLENBQUMifQ==