必要概念
- 如果两个顶点是相互可达的,那么他们是强连通的。
- 如果一幅有向图中任意两个顶点都是相互连通的,那么这个有向图也是强连通的。
- 两个顶点是强连通的当且仅当他们都在一个普通的环中。
- 有向图的强连通性也是一种顶点之间的等价关系(自反、对称、传递)。
- 作为一种等价关系,强连通性将所有的顶点分成一些等价类,每个等价类都是由互为强连通的顶点的最大子集组成的,这些子集被称为强联通分量。
一个含有N个顶点的有向图,如果是有向无环图,那么他有N个强联通分量。如果是强连通图,那么他只有一个强联通分量。一般的,联通分量个数在1~N之间。
感性认识
- 强连通分量帮助教师将课程分类,哪些课是紧密相关的。
- 帮助生态学家理解食物链中能量的流动。
- 帮助软件工程师归类不同的模块,加以封装。
高效计算强连通分量: Koaraju算法
- 对给定有向图
G
的反向图G'
计算他的逆后序排列,点这里详细了解 - 按照上一步得到的顺序来访问未被标记的节点 ,在
G
中进行标准的dfs()
。 - 所有在同一个递归dfs()中被访问到的顶点都在同一个强连通分量中。
证明
先证明,每个和s强连通的的顶点v,一定会在调用dfs(G,s)时被访问到。
用反证法,假如不能从s访问到v,说明不存在从s到v的路径,和题设s/v强连通矛盾,得证原命题成立。
再证明,按照G’逆后序调用dfs(G,s)所达的任意顶点v必然和s是强连通的。
设v是dfs(G,s)到达的某个顶点,根据上一部分证明可知,必然存在s到v的路径。下面只要证明,v到s的路径也存在,即一定强连通。
而G中存在v到s的路径,等价于G的反向图G'
中,s到v的路径存在。
注意到,当前已知调用dfs(G,s)时,能访问到v,说明,在G’的逆后序中,s在前(栈顶)v在后(栈底),于是,在G’中dfs(v)只有以下两种可能:
- 发生在dfs(s)调用之前,(并且在dfs(s)调用之前结束)
- 发生在dfs(s)调用之后,(并且在dfs(s)结束之前结束)
第一种情况不可能,因为,图G'
中,v到s的路径存在。第二种说明,G’中存在s到v的路径。
图例说明
理论清楚后,就可以写代码了。
具体实现点这里 计算强连通分量的个数