定义
有向图G = (V,E)的一个强连通分量是一个最大的顶点集合C,对于C中的每一对顶点u和v,有u可达v且v可达u,即顶点u和v互相可达。
算法
拓扑排序
TOPOLOGICAL-SORT(G)
1 调用DFS(G)计算每个顶点v的完成时间f[v]
2 当每个顶点已完成时,将其插入到链表的前面
3 返回顶点链表
强连通分量
STRONGLY-CONNECTED-COMPONENTS(G)
1 调用DFS(G)计算每个顶点u的完成时间f[u]
2 计算G的转置图GT
3 调用DFS(GT). 但再DFS主循环中,按第一步计算的f[u]降序考虑顶点
4 将第3步中形成的深度优先森林中每颗树的顶点作为单独的强连通分量输出
//每颗深搜树T对应一个强连通分量C
题目
基本思想是用一个简单有向环替换每个强连通分量SCC内部的边,然后删除SCC之间的冗余边。
因为在具有k个顶点的 SCC中必须至少有k个边,k条边的有向环给出了具有最少可能边的k顶点SCC.
该算法的工作如下:
1 识别G的所有强连通分量SCC
2 形成强连通分量图GSCC
3 E' = NIL
4 对于G的每个SCC,设SCC中的顶点为v1, v2, ..., vk,
将有向边(v1, v2), (v2, v3),...,(vk-1, vk),(vk, v1)添加到E'.
这些边形成一个简单的有向环,包括SCC的所有顶点。
5 对于强连通分量图GSCC中的每条边(u, v),选择SCC[u]中的任意顶点x和SCC[v]中的任意顶点y
并添加有向边(x, y) to E'.
参考
算法导论原书第二版