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

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

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

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

下面解释一下为什么dfn[i]==low[i]的时候就说明找到一个强连通分量,你想想,我到达了一个节点,这个节点费劲力气也只能到达自己,那它是不是可以作为一个强连通分量的根,为什么不止他自己的,因为我们深度优先搜索实际上是形成了一个深度优先搜索树,而这个点,就是我们之前找到的n节点,这个节点的子树可以反过来到达它,因此,这棵子树就是一个强连通分量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值