一、Tarjan求有向图强连通分量
1、什么是强连通分量?
“在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶点强连通(strongly connected)。如果有向图G的每两个顶点都强连通,称G是一个强连通图。有向图的极大强连通子图,称为强连通分量。”
简单来说 连通:在无向图中,从任意点i可到达任意点j (如下图所示,可以想象成电话线,a可以给b打电话,b也可以给a打)
强连通:在有向图中,从任意点i可到达任意点j
强连通是比较难实现的,所以在一般情况下我们只能退而求其次,求出这个图中在某一些局部的区域是强连通的,由此引出强连通分量的概念(有向图的极大强连通子图), 下图红色区域内的即为强连通分量。反正就是在图中找到一个最大的图,使这个图中每个两点都能够互相到达。这个最大的图称为强连通分量,同时一个单独的点也属于强连通分量。
2、强连通分量怎么找?
DFS遍历:先递归相邻节点,再访问当前节点
如果仍然是上面那张图,我们对它进行DFS遍历
在这我们举个例子来说明
先定义顶点x(i,j),
i:DFS中,x点被访问的时间点
j:x通过有向边可回溯到的最早时间点
首先 我们先访问a点,此时a的时间点属性为(1,1),放入栈中;接下来访问b点,b此时为(2,2),放入栈中;再访问c点,c为(3,3),放入栈中;接下来再访问d点,d此时为(4,4),放入栈中。接下来就是关键点了,我们现在要输出d,d可以通过指向b的这条边访问到b,b