您的位置:首页 > 其它

Tarjan 算法 求有向图强连通分量

2015-11-26 21:36 197 查看
最近在网上看了很多关于Tarjan求有向图强连通分量的算法,感觉说的有点太专业了,让我这种菜鸟看一句话绕半天绕不出来,我想尝试一下用略微通俗的语言讲一下这个算法。

首先,这个算法是基于深度优先搜索的(DFS),你必须理解图的深度优先搜索流程,然后我们需要明白在一个强连通分量中,任何两个点都是可达的,那么,你在对图进行深度优先搜索的时候,如果出现了环,是不是就意味着你找到了一个连通分量,因为环中的任何两个节点都是可达的,实际上,这基本就是Tarjan算法的核心思想,找环。

下面的问题就是怎么找环,于是,与代码相关的部分就来了,dfn数组和low数组,前者就是一个时间戳,记录这个节点是第几个被访问的;后者也很简单,表示从该节点出发,能够到达的dfn值最小的点,意思就是说,我曾经访问了一个点n,现在我转了一圈,访问到了点b,如果b点也可以到达n,那不就形成了一个环,这个环就是n....b,n。

下面解释一下为什么dfn[i]==low[i]的时候就说明找到一个强连通分量,你想想,我到达了一个节点,这个节点费劲力气也只能到达自己,那它是不是可以作为一个强连通分量的根,为什么不止他自己的,因为我们深度优先搜索实际上是形成了一个深度优先搜索树,而这个点,就是我们之前找到的n节点,这个节点的子树可以反过来到达它,因此,这棵子树就是一个强连通分量。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息