强连通分量(Kosaraju算法)

求有向图的强连通分量除了大家熟知的trajan,还可以用Kosaraju
先说算法流程:
1,对原图dfs一遍,并将出栈顺序的逆序作为“伪拓扑序”
2,对原图够构反向图
3,按伪拓扑序在反向图上dfs,新遍历到的点都属于同一个强联通分量。

正确性证明:
s在反向图上dfs能够遍历到t,说明存在t到s的路径,而现在需要证明的就是存在s到t的路径。
我们知道,s的伪拓扑序小于t,也就是s后退栈,有两种情况:
1,dfs(t)start->dfs(t)end->dfs(s)start->dfs(s)end
2,dfs(s)start->dfs(t)start->dfs(t)end->dfs(s)end
第一种情况t到s不存在路径,所以只可能是第二种情况,也就是一定存在s到t的路径。

另外该算法具有一个性质:如果我们把求出来的每个强连通分量缩成一个点,并且用求出每个强连通分量的顺序来标记收缩后的结点,那么这个顺序就是强连通分量缩点后所形成的有向无环图的拓扑序列。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值