美文网首页
Kosaraju算法的拓扑排序解释

Kosaraju算法的拓扑排序解释

作者: KiwiXR | 来源:发表于2019-07-14 22:36 被阅读0次
    • 拓扑排序对于这个算法的理解有很大的帮助。

    Kosaraju算法求强连通分量的步骤是:

    (1)在正图中进行一次dfs1并找出DFS遍历的退出顺序,记录在栈中(栈顶为最后退出);
    (2)在负图中进行第二次dfs2,顺序为从栈顶到栈底,此时即可找出各强连通分量。

    对这个过程,拓扑排序可以给出一个简单的解释:

    • 假设图上已经完成缩点,则可以得到一张有向无环图(DAG),对这张图,可以轻松得到其拓扑序。
    • 假设缩点后图上三个点(也即点集)A,B,C,满足拓扑序A \rightarrow B \rightarrow C,则可以证明,无论S=A\cup B\cup C中所有点在dfs1中访问顺序如何,在栈中,一定存在A中的点在B上方,BC同理。
      证明如下:
      (1)如果先访问到B中的点,则一定接下来不会访问到A中的点,所以A中的点都比B中后访问到,于是A中的所有点在栈中都比B中任意点的高。
      (2)如果先访问到A中的点,则在访问B之前显然会有A的点被访问到(譬如说上述点),因此该点在栈中位置比B中任意点都高。
    • 从而在进行第二次dfs2时,拓扑序靠前的点集中一定有点先访问到。因为第二次dfs2中所有边反向,所以拓扑序正好颠倒过来,用上面的例子来讲就是在反向图中有A \leftarrow B \leftarrow C,而访问点集中的任意一个点就可以且仅可以访问到当前点集中的所有点(因为反向图将拓扑序颠倒,所以先访问到出度为0的点集,也即A中的所有点;同样因为反向图将AB之间的有向边反向,使得只能访问到A中的点);访问后的标记相当于将A中的所有点出列,此时B为新的入度为0的点。依次下去,就可以找到所有的强连通分量。

    相关文章

      网友评论

          本文标题:Kosaraju算法的拓扑排序解释

          本文链接:https://www.haomeiwen.com/subject/wtxwkctx.html