我正在阅读算法简介。在22.5强连通分量中,STRONGLY-CONNECTED-COMPONENT(G)算法定义为:
如果我将alogrithm更改为仅使用G,而不计算G转置。还要按增加u.f(拓扑排序的反向顺序)的顺序考虑顶点:
为什么这个算法错了?
答案 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)可能不是最小的。