How do I learn Tarjan's algorithm?

前端 未结 4 1429
遇见更好的自我
遇见更好的自我 2021-02-13 05:36

I have been trying to learn Tarjan\'s algorithm from Wikipedia for 3 hours now, but I just can\'t make head or tail of it. :(

http://en.wikipedia.org/wiki/Tarjan\'s_stro

4条回答
  •  星月不相逢
    2021-02-13 06:19

    The idea is: When traversing the tree, every time you've searched through a branch and are backtracking, you check whether you've encountered an edge to an 'upper' node in the tree.

    • If you didn't (if (v.lowlink = v.index)), then you've just completed an SCC - it consists of the current node and all nodes on the stack. That's exactly a subtree of the DFS tree, except for the nodes in SCCs that were already completed.

    • If you did, you propagate this information to 'upper' nodes (v.lowlink := min(v.lowlink, w.lowlink)), because combined with the path in DFS tree the edge creates an 'upward' path.

    DFS produces a forest, but you always consider one tree a time. An SCC is always included in one DFS tree, otherwise (being an SCC) there would be a path in both directions between both (all) trees in question - that's a contradiction.

提交回复
热议问题