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算法详解的主要内容,如果未能解决你的问题,请参考以下文章