tarjan算法寻找无向图的强连通分量

强连通:在一个有向图G里,设有两个点a和b,由a有一条路可以走到b,由b又有一条路可以走到a,我们就叫这两个顶点(a,b)强连通。

强连通图:如果在一个有向图G中,每两个点都强连通,我们就叫这个图为强连通图。

强连通分量:在一个有向图G中,有一个子图,这个子图每2个点都满足强连通,我们就叫这个子图叫做强连通分量。

 

概念:

1)DFN[i]:i节点在被搜索到时的编号,它的值根据搜索次序会依次递增;

2)LOW[i]:i节点联通到的最小值,初始化为DFN[i]值,会根据遍历到的节点不断更新,不断选择最小的LOW值。

假设有无向图

tarjan算法寻找无向图的强连通分量_第1张图片

1)从1节点开始,1入栈,且DFN[1] == LOW[1] == 1

2)1开始遍历搜索,搜索到2,2入栈,且DFN[2] == LOW[2] == 2

3)2开始遍历搜索,搜索到3,3入栈,且DFN[3] == LOW[3] == 3

4)3开始遍历搜索,搜索到4,4入栈,且DFN[4] == LOW[4] == 4

5)4开始遍历搜索,搜索到5,5入栈,且DFN[5] == LOW[5] == 5

tarjan算法寻找无向图的强连通分量_第2张图片

5)5开始遍历搜索,

5.1)搜索到2,此时2在栈内,则LOW[5]取(LOW[5],LOW[2])中的最小值,即LOW[5]==2,DFN[5]==5

5.2)搜索到1,此时1在栈内,则LOW[5]取(LOW[5],LOW[1])中的最小值,即LOW[5]==1,DFN[5]==5

6)5搜索完毕,开始回退,此时LOW[5]==1,DFN[5]==5不相等,说明不是强连通分量的根节点,将5出栈

7)4搜索完毕,此时LOW[4]==min(LOW[4],LOW[5])==1 != DFN(4),4出栈

8)3搜索完毕,此时LOW[3]==min(LOW[3],LOW[4])==1 != DFN(3),3出栈

9)2搜索完毕,此时LOW[2]==min(LOW[2],LOW[3])==1 != DFN(2),2出栈

10)1继续搜索,搜索到6,6入栈,且DFN[6] == LOW[6] == 6

11)6开始遍历搜索,搜索到7,7入栈,且DFN[7] == LOW[7] == 7

12)7搜索完毕,此时LOW[7]== DFN(7)==7,说明7是一个强连通节点,并将7出栈

13)从6继续搜索到8,8入栈,且DFN[8] == LOW[8] == 8

14)8继续搜索,搜索到9,9入栈,且DFN[9] == LOW[9] == 9

15)9继续搜索,搜索到6,此时6在栈内,则令LOW[9]==min(LOW[9],LOW[6])==6

16)9搜索完毕,开始回退,此时LOW[9]== 6 != DFN(9) == 9,9出栈

17)8搜索完毕,开始回退,此时LOW[8]==min(LOW[8],LOW[9])==6 != DFN(8),8出栈

18)6搜索完毕,开始回退,此时LOW[6]== DFN(6)==6,说明6是一个强连通节点,并将6出栈

19)1搜索完毕,开始回退,此时LOW[1]== DFN(1)==1,说明1是一个强连通节点,并将1出栈

20)所有节点遍历完成,结束

得到强连通节点7,6,1。

你可能感兴趣的:(图论)