给定图G,可以使用该算法找到SCC:
DFS(G) // compute finish times f[u]
GT = Transpose(G)
DFS(GT) // considering vertices in order of decreasing f[u]
我想要了解的是:为什么第二个DFS必须按照完成时间减少的顺序完成,有没有办法证明它?为什么,例如,以递增顺序考虑顶点不能计算出正确的SCC?
我已经在这里阅读了一些答案和例子,但他们没有帮助。问题是如何证明这一事实。
由于
答案 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个节点u
和v
}}
但感谢您的回答。