强连接组件算法澄清

时间:2013-09-28 11:51:36

标签: algorithm graph-algorithm

给定图G,可以使用该算法找到SCC:

DFS(G)   // compute finish times f[u]
GT = Transpose(G)
DFS(GT)  // considering vertices in order of decreasing f[u]

我想要了解的是:为什么第二个DFS必须按照完成时间减少的顺序完成,有没有办法证明它?为什么,例如,以递增顺序考虑顶点不能计算出正确的SCC?

我已经在这里阅读了一些答案和例子,但他们没有帮助。问题是如何证明这一事实。

由于

2 个答案:

答案 0 :(得分:0)

那么,你只想要一个反例?

让我们只取两个顶点(1和2)和一个从1到2的链接(但不是从2到1)的图形。 该图的SCC为{1}和{2}。 从1开始DFS,我们转到2,其中DFS不能扩展得更多,所以2完成,1完成,因为从1的唯一边缘变为2。顺序是2; 1。 让我们转换图形,并且不要故意按照算法通过在2上启动转置图的DFS(我们应该从1开始)。 从2开始,我们可以在转置图上转到1。 DFS给出1和2作为选中,因此{1,2}将是SCC,尽管它不是SCC。

此反例证明我们无法接受第二个DFS所需的顺序,但这并不能证明每次都会得到错误的结果。

例如,让我们使用1到2之间链接的相同图形,以及从2到1的链接。该图形的唯一SCC是{1,2}。 让我们从1开始第一个DFS。这也给出了2的顺序; 1。 现在,如果我们再次在1上启动转置图的DFS,我们将得到{1,2}作为SCC。 因此,对于这种情况,我们有参加的结果。

TL; DR:“获得好结果”和“按降序取顶点”之间没有等价关系。但后者暗示了前者。

答案 1 :(得分:0)

好的,明白了。 完成时间的顺序是防止通过(原始图的)交叉边缘访问组件外部的顶点,因为在转置图中,如果{{1},则连接2个节点uv }}

但感谢您的回答。

相关问题