有向图中的强连通性.
定义:如果有向图中两个顶点 v v v, w w w是相互可达的, 则称它们为强连通的.如果一幅有向图中任意两点均为强连通的, 则该有向图为强连通图.
有向图的强连通分量是由相互均为强连通顶点的最大子集构成的.
强连通分量搜索算法:Kosaraju
首先, 定义有向图 G G G的反向图 G R G^R GR.由有向图 G G G中每一条有向边 v − > w v->w v−>w取反的反向边 w − > v w->v w−>v构成的图称为图 G G G的反向图,记为 G R G^R GR.
Kosaraju算法:
- 保存反向图 G R G^R GR各节点搜索的逆后序结果.
- 按照第一步搜索得到的顺序, 依次对图 G G G顶点进行深度优先搜索, 所有连通分量即为图 G G G的强连通分量.
证明:
对Kosaraju算法的证明分为两部分:
- 证明对图
G
G
G的顶点
v
v
v进行深度优先搜索
dfs(G, v)
时, 与节点 v v v强连通的节点 w w w一定能被搜索到. - 证明对图
G
G
G的顶点
v
v
v进行深度优先搜索
dfs(G, v)
时, 所有搜索得到的顶点 w w w与 v v v均为强连通的.
基于1,2证明, 即可证明, 对图 G G G中节点 v v v进行深度优先搜索得到的连通分量即为节点 v v v强连通节点的最大子集, 因此为强连通分量.
首先证明第一部分:
使用反证法证明:
与
v
v
v强连通的顶点
w
w
w一定会在dfs(G, v)
调用中被遍历到.
假设图中节点
v
v
v尚未被搜索,则对其 进行dfs(G, v)
搜索. 若当前与节点
v
v
v强连通的节点
w
w
w在dfs(G, v)
搜索时未被搜索到, 则
w
w
w肯定已经被搜索过, 因此dfs(G, w)
调用在前,由于存在从
w
−
>
v
w->v
w−>v的路径, 因此节点
v
v
v在dfs(G, w)
的调用中一定会被标记,与假设相违背, 证明结束时.
证明第二部分:
dfs(G, v)
调用遍历到的节点
w
w
w与
v
v
v均强连通.
由于dfs(G, v)
调用可达节点
w
w
w, 因此图
G
G
G中存在由
v
v
v到
w
w
w的边, 因此只需证明存在由
w
w
w到
v
v
v的边即可.这一结论继而可以通过证明在反向图
G
R
G^R
GR中存在从
v
v
v到
w
w
w的边即可.由于图
G
G
G中节点的调用顺序为
G
R
G^R
GR中节点遍历的逆后序.因此在
G
R
G^R
GR的调用中, 对dfs(G^R, w)
的调用早于dfs(G^R, v)
结束.这可能包含两种情况, 其一,
G
R
G^R
GR中存在从
v
−
>
w
v->w
v−>w的路径, 因此证明结束.其二,
G
R
G^R
GR中不存在从
v
−
>
w
v->w
v−>w的路径, dfs(G^R, w)
调用发生在dfs(G^R, v)
之前.我们知道, 由于
G
G
G中存在从
v
v
v到
w
w
w的路径, 因此
G
R
G^R
GR中存在从
w
w
w到
v
v
v的路径, 因此若dfs(G^R, w)
调用发生在dfs(G^R, v)
之前, 则v节点肯定会被遍历到.因此情形二不可能存在. 证明结束.