有向图中强连通分量查找

有向图中的强连通性.

定义:如果有向图中两个顶点 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算法:

  1. 保存反向图 G R G^R GR各节点搜索的逆后序结果.
  2. 按照第一步搜索得到的顺序, 依次对图 G G G顶点进行深度优先搜索, 所有连通分量即为图 G G G的强连通分量.

证明:
对Kosaraju算法的证明分为两部分:

  1. 证明对图 G G G的顶点 v v v进行深度优先搜索dfs(G, v)时, 与节点 v v v强连通的节点 w w w一定能被搜索到.
  2. 证明对图 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 wdfs(G, v)搜索时未被搜索到, 则 w w w肯定已经被搜索过, 因此dfs(G, w)调用在前,由于存在从 w − > v w->v w>v的路径, 因此节点 v v vdfs(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节点肯定会被遍历到.因此情形二不可能存在. 证明结束.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值