强连通图 学习笔记及tarjan模板
我是从算法导论看起的:
定义:在一个有向图中,任意两个点都是互相可达的,则称为强连通图。
解法步骤:
1.先对每个节点dfs。计算出 每个节点的finishing time f[u]。
2.对图进行倒置处理。
3.对倒置图的每个节点,按照f【u】降序的顺序进行dfs。
4.输出在步骤3中dfs时建立的每棵树的节点。这些树即分别是强连通分支。
时间复杂度分析:
在给定图G的邻接表表示的情况下,建立G倒置图的时间复杂度为O(V+E)。
而dfs也是O(V+E),故整个时间复杂度是线性时间O(v+e).
对这个解法的理解关键在理解finishing time的特点,算法导论书上对其有关键推论。
根据上面算法写的粗糙代码:
数据:
8 14
1 2
2 5
2 6
2 3
3 7
3 4
4 3
4 8
5 1
5 6
6 7
7 6
7 8
8 8
代码:
http://www.byvoid.com/blog/scc-tarjan/
推荐这个链接,是求强连通分量的tarjan算法。
下面是参照链接里的描述写的代码:
测试数据同上.
浙公网安备 33010602011771号