如果我在计算强连接组件时不使用G转置怎么办?

时间:2014-11-23 07:55:06

标签: algorithm data-structures graph-theory depth-first-search directed-graph

我正在阅读算法简介。在22.5强连通分量中,STRONGLY-CONNECTED-COMPONENT(G)算法定义为:

  1. 调用DFS(G)计算每个顶点的完成时间u.f
  2. 计算G转置
  3. 调用DFS(G转置),但在DFS的主循环中,按u.f递减的顺序考虑顶点(在第1行中计算)
  4. 将第3行中形成的深度优先林中每棵树的顶点输出为单独的强连接组件
  5. 如果我将alogrithm更改为仅使用G,而不计算G转置。还要按增加u.f(拓扑排序的反向顺序)的顺序考虑顶点:

    1. 调用DFS(G)计算每个顶点的完成时间u.f
    2. 调用DFS(G),但是在DFS的主循环中,按照增加u.f的顺序考虑顶点(在第1行中计算)
    3. 输出第2行中形成的深度优先林中每棵树的顶点
    4. 为什么这个算法错了?

2 个答案:

答案 0 :(得分:0)

通过定义,强连通分量中的顶点彼此连接(通过路径,不一定是直接边缘)。如果你在顶点X上进行第一次DFS调用,你会发现"哪些顶点是X连接到" (X - > N)。为了确保所有这些顶点都连接到X(N - > X)并因此验证强连接,您需要以相反的方向遍历边缘。最简单的方法是通过转置图表。

如果您查找算法证明,我相信您会找到一些。它可能不是最容易理解的,但请查看此源代码,例如: Correctness of the algorithm for finding strongly connected components

答案 1 :(得分:0)

你的问题实际上是书中练习22.5-3。这里给出了替代算法正确性的反例: http://sites.math.rutgers.edu/~ajl213/CLRS/Ch22.pdf

  

培根教授的建议没有成功。举个例子,假设   我们的图形位于三个顶点{1,2,3}上,由边(2,1),(2,3),(3,2)组成。   然后,我们最终应该以{2,3}和{1}作为我们的SCC。但是,有可能   DFS从2开始可以在1之前探索3,这意味着完成   15   3的时间低于1和2.这意味着当我们第一次执行时   DFS从3开始。但是,从3开始的DFS将能够到达所有其他   顶点。这意味着该算法将返回整个图形为a   单个SCC,即使事实并非如此,因为既没有路径   从1到3的1到2。

我对替代算法失败的解释是,在强连通分量C中给定顶点v,如果f(v)是最大的,则f(C)必须是最大的,但如果f(v)是最小的,比f(C)可能不是最小的。