强连通分量(Korasaju & Tarjan)学习笔记

好久以前学过的东西...现在已经全忘了

很多图论问题需要用到强联通分量,还是很有必要重新学一遍的


强联通分量(Strongly Connected Component / SCC)

指在一个有向图中,存在的一个顶点集合S,对于所有顶点vi∈S,都保证能够互相到达

环就是最简单的强联通分量之一

但是强联通不等于简单的环,还有可能是环套环、换套环套环...没有高效的算法很难解决这类问题


Korasaju

Korasaju是一个比较直观的解决SCC问题的算法,只需要用到两遍dfs

算法流程如下

(1)假设给定了一个如下的有向图

(2)对于原图进行一遍dfs,并且记录每一个顶点回溯时(★1)的序号(类似于树的后序遍历)

(3)建立一个反向图(将原图所有的边反向)

(4)按顶点dfs回溯序号从大到小(★2)进行rdfs(反向dfs),所有能访问到的顶点同属一个强联通分量

貌似看起来很简单.jpg

但是这个算法中有两个第一眼看过去并不容易理解的蛇皮操作

(★1):为什么要记录dfs的后序而不是前序?

(★2):反向建图后,为什么要按dfs后序从大到小的顺序进行rdfs?

而这正是Korasaju算法的关键

首先我们知道,dfs的过程其实形成了一颗搜索树,由先访问到的顶点(层数较小)指向后访问的顶点(层数较大)

而强连通分量的性质是,在同一个分量中的任意两个顶点可以互相到达

而我们就是要选出满足这个性质的点集

先考虑按照dfs的规则,从一点A到达另一点B的条件:在搜索树中,所有层数较高的顶点A都可以按照dfs的顺序到达层数较低的顶点B(这不是说B就不能到达A,而是仅针对单向边的搜索树而言)

而A到达B对于AB同属一个强联通分量是必要不充分条件:例如图例中的顶点7,在以1为起点的dfs中会被访问到,但仅在自身({ 7 })的强联通分量中

我们想制定一种规则,希望在rdfs的过程中,只要能够被同一个起点的rdfs访问到,就属于同一个强联通分量

待续

猜你喜欢

转载自www.cnblogs.com/LiuRunky/p/10056473.html