强连通图 学习笔记及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算法。

下面是参照链接里的描述写的代码:

测试数据同上.



posted on 2011-10-24 23:02  不是我干的  阅读(841)  评论(0)    收藏  举报