ts-ds-tool
Version: 
Data structure and algorithm of TypeScript
42 lines (41 loc) • 1.52 kB
JavaScript
import { HashMap } from "../../../hashmap/HashMap";
export function tarjan(graph) {
    const vertices = graph.getVertexs();
    const stack = [];
    const components = [];
    const visitedMap = new HashMap();
    vertices.forEach(item => stronglyConnect(item, stack));
    return components;
    function stronglyConnect(vertex, visitedStack, dfn = new HashMap(), low = new HashMap(), index = 1) {
        if (visitedMap.get(vertex.Key)) {
            return;
        }
        index++;
        visitedStack.push(vertex);
        dfn.put(vertex.Key, index);
        low.put(vertex.Key, index);
        const neighbors = vertex.getNeighbors();
        neighbors.forEach(item => {
            if (!dfn.get(item.Key)) {
                stronglyConnect(item, visitedStack, dfn, low, index);
            }
            if (!visitedMap.get(item.Key)) {
                const lowIndex = low.get(item.Key);
                const currentLowIndex = low.get(vertex.Key);
                low.put(vertex.Key, Math.min(currentLowIndex, lowIndex));
            }
        });
        const lowIndex = low.get(vertex.Key);
        const dfnIndex = dfn.get(vertex.Key);
        if (lowIndex === dfnIndex) {
            let target;
            const smallComponents = [];
            do {
                target = visitedStack.pop().Key;
                visitedMap.put(target, true);
                smallComponents.push(target);
            } while (target !== vertex.Key);
            components.push(smallComponents);
        }
    }
}