强连通分量
深度优先搜索除了可以用于拓扑排序之外,还可以用于一个经典问题:将有向图分解为强连通分量。
有向图
G=<V,E>
的强连通分量是一个最大结点集合
C
属于
V
,对于该集合中的任意一对结点
u
和
- 栗子:
引理1:设 C 和
C 是有向图 G=<V,E> 的两个不同的强连通分量,假如存在一条边 (u,v) in E ,这里u in C ,v in C′ ,则 f(C)>f(C′) . f表示finish访问的时间。图G:
- 图G’
推论1:设 C 和
C′ 是有向图 G=<V,E> 的两个不同的强连通分量。 假如存在一条边 (u,v) in E′ , u inC , v inC′ ,那么 f(C)<f(C′)从上面两个图可以看出来,引理1和推论1从直观上都是正确的。推论1告诉我们, G′ 不可能包含从 C 到其他任何强连通分量的边,因此从C中某个结点开始的搜索不会访问到任何其他分量的结点
而对于强连通分量来说,不管是在
G 还是在 G′ ,它都是强连通的。
计算强连通分量的算法:
- 两次DFS
- 第一次用在
G
上,找出拓扑排序;第二次用在
G′ 上,找出所有的强连通分量
STRONGLY-CONNECTED-COMPONENTS(G)
1. call DFS(G) to compute finishing times u.post for each vertex u
2. compute G'
3. call DFS(G'), but in the main loop of DFS, consider the vertex
in order of decreasing u.post (as a topological-sort)
4. output the vertices of each tree in the depth-first forest
formed in step 3 as a separate strongly connected component
算法的时间复杂度为 O(V+E) ,因为DFS为 O(V+E) ,而创建 G′ 为 O(V+E) 。