Algorithm 强连通分量算法

Algorithm 强连通分量算法,algorithm,graph-algorithm,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 我已经在这里读了一些答案和例子,但它们没有帮助。问题是如何证明这一事实 谢谢那么,

给定一个图G,可以使用以下算法找到SCC:

DFS(G)   // compute finish times f[u]
GT = Transpose(G)
DFS(GT)  // considering vertices in order of decreasing f[u]
我试图理解的是:为什么第二个DFS必须按减少完成时间的顺序进行,有没有办法证明这一点?例如,为什么按递增顺序考虑顶点不能计算正确的SCC

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


谢谢

那么,你只需要一个反例

让我们看一个有两个顶点(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:“获得好结果”和“按降序获取顶点”之间没有等价性。但是后者意味着前者。

好的,明白了。 完成时间的顺序是防止组件外的顶点通过交叉边(原始图形)访问,因为在转置图形中,这些交叉边连接两个节点
u
v
if
d[u]

不过,谢谢你的回答