术语
强连通
在一幅有向图中,如果从顶点v有一条有向路径到达w,则顶点w是从顶点v 可达的。
如果两个顶点v和w是互相可达的,则称它们为强连通的。
如果一幅有向图中的任意两个顶点都是强连通的,则称这幅有向图是强连通图。
环在强连通性的理解上起着重要的作用。两个顶点是强连通的当且仅当它们都在一个普通的有向环中。
强连通分量
强连通性将所有顶点分为了一些平等的部分,每个部分都是由相互均为强连通的顶点的最大子集组成。
这些子集称为强连通分量。
一个强连通图只含有一个强连通分量,而一个有向无环图中则含有 V 个强连通分量。
Kosaraju 算法
我们在 算法CC 中看到过,计算无向图的连通分量只是深度优先搜索的一个简单应用。
那么在有向图中该如何高效计算强连通分量呢?
步骤如下:
– 在给定的一幅有向图G中,使用 DepthFirstOrder 来计算它的反向图 G R G^R GR 的逆后序排列。
– 在G中进行标准的深度优先搜索,但是要按照刚才计算得到的顺序而非标准的顺序来访问所有未被标记的顶点。
– 在构造函数中,所有在同一个递归 dfs() 调用中被访问到的顶点都在同一个强连通分量中,将它们按照和CC相同的方式识别出来。
/*
* 计算强连通分量的 Kosaraju 算法
*/
public class KosarajuSCC {
private boolean[] marked; // 已访问过的顶点