码迷,mamicode.com
首页 > 移动开发 > 详细

强联通分量之kosaraju算法

时间:2017-09-03 20:17:13      阅读:239      评论:0      收藏:0      [点我收藏+]

标签:算法   强联通   最大   kosaraju   强连通   建立   存在   深度优先搜索   集合   

  首先定义:强联通分量是有向图G=(V, E)的最大结点集合,满足该集合中的任意一对结点v和u,路径vu和uv同时存在。

  kosaraju算法用来寻找强联通分量。对于图G,它首先随便找个结点dfs,求出每个节点最后一次访问的时间戳f(x),然后我们建立反图Gt,接着根据倒序的时间戳来dfs每个节点,每次dfs到的结点集合就是一个强联通分量。事实上这个算法的思想和拓扑排序类似。

  我们来证明它(注意这里面的图指原图,而不是反图):

引理:对于G中的两个强联通分量C和C’,若点u属于C,点v属于C‘,且存在边(u,v),那么f(C)>f(C‘)。

  证明应该很好想。。如果先访问C,那么一定会先访问完C‘再访问C。如果先访问C’,因为强联通分量的性质,C一定不在C’的深度优先搜索树中。

推论:对于G中的两个强联通分量C和C’,若点u属于C,点v属于C‘,如果f(C)>f(C‘),那么不可能存在边(v,u)

  因为若有边(v,u),访问C‘一定会访问到C,然后C先退出。如果先访问C,那么f(C)依旧小于f(C’)

证明:若根据倒序的时间戳dfs结点,那么最后一个结点一定属于最后一个结束访问的强联通分量C‘(因为C’被访问到的次序就是由最后一个结点的时间戳决定的),也就是f(C‘)>f(任意一个C)。根据推论,在原图中不可能存在边,从其它强联通分量连向它。也就是对于反图来说,从当前结点dfs只会dfs到最后一个结束访问的强连通分量。接着,倒序找到第二个没有被访问过的点,它属于倒数第二个结束访问的强联通分量,并且按原图来看,只可能有前面访问过的强联通分量向它连边,所以它只能访问自己所属的强联通分量。以此类推,可以证明算法的正确性。

  这个证明的重点在于:目前倒序来看,最先没有访问过的点属于新的待处理强联通分量。

 

强联通分量之kosaraju算法

标签:算法   强联通   最大   kosaraju   强连通   建立   存在   深度优先搜索   集合   

原文地址:http://www.cnblogs.com/MyNameIsPc/p/7466356.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!