Spaces:
Build error
Build error
| import * as _ from 'lodash-es'; | |
| export { parentDummyChains }; | |
| function parentDummyChains(g) { | |
| var postorderNums = postorder(g); | |
| _.forEach(g.graph().dummyChains, function (v) { | |
| var node = g.node(v); | |
| var edgeObj = node.edgeObj; | |
| var pathData = findPath(g, postorderNums, edgeObj.v, edgeObj.w); | |
| var path = pathData.path; | |
| var lca = pathData.lca; | |
| var pathIdx = 0; | |
| var pathV = path[pathIdx]; | |
| var ascending = true; | |
| while (v !== edgeObj.w) { | |
| node = g.node(v); | |
| if (ascending) { | |
| while ((pathV = path[pathIdx]) !== lca && g.node(pathV).maxRank < node.rank) { | |
| pathIdx++; | |
| } | |
| if (pathV === lca) { | |
| ascending = false; | |
| } | |
| } | |
| if (!ascending) { | |
| while ( | |
| pathIdx < path.length - 1 && | |
| g.node((pathV = path[pathIdx + 1])).minRank <= node.rank | |
| ) { | |
| pathIdx++; | |
| } | |
| pathV = path[pathIdx]; | |
| } | |
| g.setParent(v, pathV); | |
| v = g.successors(v)[0]; | |
| } | |
| }); | |
| } | |
| // Find a path from v to w through the lowest common ancestor (LCA). Return the | |
| // full path and the LCA. | |
| function findPath(g, postorderNums, v, w) { | |
| var vPath = []; | |
| var wPath = []; | |
| var low = Math.min(postorderNums[v].low, postorderNums[w].low); | |
| var lim = Math.max(postorderNums[v].lim, postorderNums[w].lim); | |
| var parent; | |
| var lca; | |
| // Traverse up from v to find the LCA | |
| parent = v; | |
| do { | |
| parent = g.parent(parent); | |
| vPath.push(parent); | |
| } while (parent && (postorderNums[parent].low > low || lim > postorderNums[parent].lim)); | |
| lca = parent; | |
| // Traverse from w to LCA | |
| parent = w; | |
| while ((parent = g.parent(parent)) !== lca) { | |
| wPath.push(parent); | |
| } | |
| return { path: vPath.concat(wPath.reverse()), lca: lca }; | |
| } | |
| function postorder(g) { | |
| var result = {}; | |
| var lim = 0; | |
| function dfs(v) { | |
| var low = lim; | |
| _.forEach(g.children(v), dfs); | |
| result[v] = { low: low, lim: lim++ }; | |
| } | |
| _.forEach(g.children(), dfs); | |
| return result; | |
| } | |