代码改变世界

DFS应用:SCC

2012-07-12 18:31  coodoing  阅读(609)  评论(0)    收藏  举报

   本文利用Kosaraju’s Two-Pass Algorithm 解决强连通子图问题。

   Kosaraju算法是求解有向图强连通分量(strong connected component)的三个著名算法之一(另两个算法为TarjanGabow),能在线性时间求解出一个图的强分量。三种算法具体的差别可参考:http://www.cppblog.com/koson/archive/2010/04/27/113694.html

   什么是强连通分量?在这之前先定义一个强连通性(strong connectivity)的概念:有向图中,如果一个顶点s到t有一条路径,t到s也有一条路径,即s与t互相可达,那么我们说s与t是强连通的。那么在有向图中,由互相强连通的顶点构成的分量,称作强连通分量。

步骤概要:

1:在该图的逆图上运行DFS,将顶点按照后序编号的顺序放入一个数组中(显然,这个过程作用在DAG上得到的就是一个拓扑排序);

2:在原图上,按第一步得出的后序编号的逆序进行DFS。也就是说,在第二次DFS时,每次都挑选当前未访问的结点中具有最大后序编号的顶点作为DFS树的树根。

python实现具体代码:

SCC-python