DFS与强联通分量(strong connected component-Sccs)

今天我们来聊一下DFS计算有向图的强联通分量Sccs。

老规矩,首先给出Sccs的定义。Sccs是一些节点的集合,该集合中任意两个节点u,v,存在路径u到v,同时也存在路径v到u。

我们来看一个示意图

 我们看,a点存在一个到b的路径,b可以通过e点到达a。因此a b e构成了一个Sccs。

那么我们如何求解一个图中的Sccs呢?

首先,我们将上图中的Sccs缩成一个点,来看看。

 我们可以看到,将Sccs缩成一个点之后,示意图变简单了不少。如果我们对简化过后的示意图来进行搜索的话,我们可以看到如果我们先搜索S1中的点,可能搜着搜着就到S2或者S3中了。反之如果我们先搜索S3中的点,则不会跑到S1或者S2中。这是一个非常重要的发现。而这个S3看起来是不是感觉很熟悉?是不是我们拓扑排序里面提到的sink node?但是拓扑排序不是使用在有向无环图中吗?是的,那是针对排序而言。这里,我们可以借助这个思想嘛。

收到sink node的启发,kosaraju算法主要就是考虑,先把图中的节点按照拓扑排序的思路先排一个顺序。同一个Sccs中的点由于形成一个环,因此他们之间顺序无所谓。但是Sccs本身的点需要有一个大的顺序。如S3中的点应该在S1前面。考虑到DFS的特点,我们知道,如果一个节点从DFS维护的栈(先入后出)中弹出,则意味着此时,该点是一个sink node了。

因此我们可以考虑如下方法:

1 首先利用DFS(利用我们拓扑排序那里那个改动过的DFS)对图进行遍历,记录所有sink node

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值