Tarjan算法详解

Posted 砂糖橘子君

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Tarjan算法详解相关的知识,希望对你有一定的参考价值。

Tarjan算法详解

  今天偶然发现了这个算法,看了好久,终于明白了一些表层的知识、、、、在这里和大家分享一下。。。

  Tarjan算法是一个求解极大强联通子图的算法,相信这些东西大家都在网络上百度过了,这里不再赘述。

  在这个算法中,定义了两个数组,一个是dfn数组,一个是low数组,相信大家在这里就晕了(我也晕了、、),不过自己模拟了几次算法执行过程之后,就理解了这个算法的意思,如果大家不明白,也可以这样做

  我觉得突破点主要在dfn数组和low数组的含义该如何诠释:

dfn数组: 意思就是在dfs的过程中,当前的这个节点是第几个被访问的

low数组: 有些并查集的意思,就是在dfs的过程中,标记如果当前节点是极大强联通子图的话,他的根节点的标号就是对应的low值:

       如果下一个要遍历的节点在栈中,那么就要把当前节点的low值设置成 下一个节点(在栈中)的dfn值,dfn值是什么呢?就是记录这个节点是第几个被遍历到的。

       如果下一个要遍历的节点不再栈中,那么就要把当前节点的low值设置成下一个节点和当前节点的low值中最小的那个。

如果还是不太明白,仔细看两遍把、、、、要不然还可以看看下面的模拟过程吧:

技术分享

(1)假如从1号节点开始遍历,开始dfs,并不断设置当前节点的dfn值和low值,并压入栈中,那么第一次在6处停止,因为6没有出度。那么此时的dfn和low值分别为:(初始化所有的low和dfn为0)

节点: 1  2  3  4  5  6

dfn:  1  0  2  0  3  4

low:  1  0  2  0  3  4

栈:   1  3  5  6

(2)6号节点没有能出边了,那么6号节点自己就成为一个极大强联通子图,弹出6,对5来说,6被访问过了,所以它也没有能访问的边了,那么5 也是一个极大强联通子图,弹出5

(3)现在模拟指针在3的位置,3遍历到4,四再遍历1号节点,因为1号节点还在栈中,那么就代表着栈中的现有的所有元素构成了一个强联通图(仔细想想、、),而且4号节点访问到了1号节点,那么就把low[4]的值设置为1号节点的根吧(low[1])那么现在的low[4] = 1(代表着4的根节点是1),再接着访问4的下一个子节点,6号节点,而6已经被访问过了,所以退出循环,退到3号节点处,3号节点也没有能访问的下一个节点了,退回到1号节点处。

(4)现在访问1号节点的下一个能访问的节点,2号节点,然后再访问4号节点,因为4号节点现在在栈中,那么还是像刚才一样,把二号节点的low值设置成4号节点的根(low[4]),现在,退回到1,遍历结束。

现在栈中有元素1,3,4,2,剩下的就是极大强联通子图了。。。

网上有许多详解Tarjan算法的例子,如果刚才我描述的还是看不懂,可以参见http://wenku.baidu.com/view/112c64096c85ec3a87c2c527.html?re=view

以上是关于Tarjan算法详解的主要内容,如果未能解决你的问题,请参考以下文章

连通图算法详解之① :Tarjan 和 Kosaraju 算法

强连通分量的Tarjan算法

Tarjan求有向图强连通详解

ACM(图论)——tarjan算法详解

LCA离线算法Tarjan详解

Tarjan 算法求 LCA / Tarjan 算法求强连通分量