图论-强连通分量
Kosaraju 算法
我们定义节点的f值,即v.f为在DFS中节点的完成时间。
我们有这样的事实:
如果在有向图中,如果存在 u → v u \to v u→v,那么 u . f > v . f u.f > v.f u.f>v.f一定成立;反过来,如果存在 v → u v \to u v→u,那么 u . f < v . f u.f < v.f u.f<v.f一定成立。
之后,我们用一个强连通分量中节点最大的f值代表这个强连通分量的f值。那么有如下的事实成立:
如果在分量图 G S C C = ( V S C C , E S C C ) G^{SCC}=(V^{SCC},E^{SCC}) GSCC=(VSCC,ESCC)中, u , v ∈ V S C C u,v \in V^{SCC} u,v∈VSCC,如果存在 u → v u \to v u→v,那么 u . f > v . f u.f > v.f u.f>v.f一定成立;反过来,如果存在 v → u v \to u v→u,那么 u . f < v . f u.f < v.f u.f<v.f一定成立。
那么,也就是说,在转置图的分量图 ( G T ) S C C (G^{T})^{SCC} (GT)SCC中,最大的f值代表的强连通分量,绝对不会指向其他连通分量,次大的f值代表的强连通分量可能会指向最大的连通分量外,绝不会指向其他的连通分量。Kosaraju就是这个思想。
第二次得到DFS得到的强连通分量的输出顺序,也是分量图的拓扑排序顺序。
升序输出可行吗?
如果Kosaraju 算法中第二次深度优先搜索时使用的原始图 G G G而不是用转置图 G T G^{T} GT,并且以完成时间的递增次序来扫描节点,这个方法可行吗,如果不可行,为什么?
这个方法不可行,因为要保证安照分量图的完成时间的递增次序来扫描节点才可性,按照原图节点的完成时间的递增次序来扫描节点无法保证强连通分量的f值是节点中的最大f值。
简化强连通分量图
一个强连通分量的简化图,就是去掉尽可能多的边,使得强连通分量保持不变。
可以证明,n个节点组成强连通分量的边数的最小形式是一个环,即一个节点指向下一个节点形成的环。
半连通图
给定有向无环图 G = ( V , E ) G=(V,E) G=(V,E),如果对于所有的节点对 u , v ∈ V u,v \in V u,v∈V,我们有 u ⇝ v u \leadsto v u⇝v或者 v ⇝ u v \leadsto u v⇝u,我们说图 G G G是半连通的。
定理:如果有向无环图 G G G是半连通的,当且仅当存在一条路径包含所有的节点 V V V。
充分性,我们将图 G G G进行拓扑排序,一直任意节点对都半连通,那么举例来说,生成的序列为u,v,w,那么一定存在边 u → v , v → w u \to v,v \to w u→v,v→w,因为u在v的后面,v在w的后面,因此充分性得证。
必要性,把这个路径排开,就是充分性的拓扑排序的序列,反过来证明即可。
因此,判断一个有向图是否是半连通的,我们只需要求它的分量图,之后按照分量图的拓扑排序看看节点之间是否都存在一条指向后方的边即可。