为什么 Kosaraju 算法一定要把所有边反向
算法课上介绍说,Kosaraju 算法的大概步骤是
-
DFS反向图,记录每个点的出栈顺序
-
逆序(出栈顺序)遍历,找到所有的强连通分量
正确性证明略…见课程 PDF…
很自然地想到一个问题…为什么不能在原图 DFS,然后顺序遍历呢?
想想证明里的那个例子,从强连通分量 SCC1 到 SCC2 有一条边,反向之后DFS,能保证最后出栈的点一定在 SCC2 中,因此第二次 DFS 时能找到正确的结果。如果在原图 DFS,则不能保证第一个出栈的点在哪里…呃,很简单嘛…
比如说 A->B,B->A, A->C 这个图,如果出栈顺序是BAC就杯具了= =
其实这个例子是网上搜到的…
comments powered by Disqus