美文网首页
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算法的拓扑排序解释

    拓扑排序对于这个算法的理解有很大的帮助。 Kosaraju算法求强连通分量的步骤是: 在正图中进行一次并找出DFS...

  • 强连通分量和Kosaraju算法

    内容概要: 基于深度优先后序遍历的DAG图拓扑排序 强连通分量 求解强连通分量Kosaraju算法 拓扑排序的另一...

  • 7.6图的应用:拓扑排序

    拓扑排序Topological Sort ❖从工作流程图得到工作次序排列的算法,称为“拓扑排序”❖拓扑排序处理一个...

  • LeetCode 第207题:课程表

    1、前言 2、思路 使用拓扑排序的方法,拓扑排序其实是使用的 BFS 算法,简而言之使用 BFS 算法解题。算法流...

  • 模板

    并查集 拓扑排序 Floyd算法 Dijkstra算法

  • 18-拓扑排序

    拓扑排序## 拓扑排序是针对有向无环图定义的,此算法可以判断一个有向图是否存在回路。拓扑排序反应的是活动和工程的先...

  • 拓扑排序算法

    拓扑排序定义对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有...

  • Lintcode 615. Course Schedule

    题目求先修课程有没有冲突,算法是用bfs, 拓扑排序 拓扑排序:找到有向图中,从头到尾的一种排序,所以中间没有环路...

  • Leetcode --- 课程表问题(拓扑排序)

    写在前:拓扑排序本质是BFS和贪心算法,是这两种算法在有向图应用的专有名词,即拓扑排序针对有向图问题。参考这里[h...

  • Graph-一般算法

    和图相关的算法有:最小生成子树,最短路径,拓扑排序。 这里仅介绍最小生成树和最短路径,拓扑排序暂时省略。 最小生成...

网友评论

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

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