求强连通分量的Kosaraju算法

步骤:1.任选一个节点对图做深度遍历,为每个节点标记开始和结束时间。

2.按照结束时间从小到大的顺序将节点入栈,并将图中的方向反置。

3.按照出栈顺序对节点做深度遍历,每遍历一次,就是一个强连通分量。

举例:

 步骤一:标记开始和结束时间。假设从r开始遍历,则r的开始时间是1,u的开始时间为2,y为3,q为4,以此类推。到w时,开始时间为7。w没有未访问相邻接点,此节点开始结束,结束时间为8。v的结束时间为9,s为10.到达q节点时,有未访问的相邻节点t,则t的开始时间为11,x为12,z为13.以此类推,完成所有节点开始时间和结束时间的标记。

 步骤二:按照结束时间从小到大把节点入栈。并将图反置。

入栈顺序为:w,v,s,z,x,t,q,y,u,r

步骤三:对节点出栈,并开始深度遍历。每遍历一次,得到一个连通分量。

出栈顺序为:r,u,y,q,t,x,z,s,v,w 

对r做深度遍历得到:r

对u做深度遍历得到:u

对y做深度遍历得到:y,t,q

q,t已经被遍历到,不再从此节点开始做深度遍历。

对x做深度遍历得到:x,z

对s做深度遍历得到:s,w,v.

于是得到五个连通分量{r},{u},{y,t,q},{x,z},{s,w,v}

其Component DAG如下:

 如有错误,欢迎指正

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值