一个有向图 G = (V, E) 如果所有顶点对 u, v 属于 V 都满足 u -> v 或 v -> u 路径,则称 G 是半连通的。 给出一个有效的算法来确定 G 是否是半连通的。
简单的 O(V^3)
解法是使用 floyd warshal 的全源最短路径,但这是过度杀伤力(从时间复杂度的角度来看)。
可以使用 O(V+E)
的方法解决。
断言:
在拓扑排序中,DAG 是半连通的,对于每个 i
,都存在一条边 (vi,vi+1)
。
证明:
给定一个具有拓扑排序 v1,v2,...,vn
的 DAG:
如果对于某个 i
,不存在边 (vi,v(i+1))
,则也不存在路径 (v(i+1),vi)
(因为它是 DAG 的拓扑排序),因此该图不是半连通的。
i
都有一条边 (vi,vi+1)
,那么对于每个 i,j
(i < j),都有一条路径 vi->vi+1->...->vj-1->vj
,并且该图是半连通的。U
是 SCC 的集合。 E'= { (V1,V2) | 存在 V1 中的 v1 和 V2 中的 v2,使得 (v1,v2) 在 E 中 }
。(v1,v2)
,使得存在一条路径 v1->...->v2
- 让 V1、V2 分别为它们的强连通分量。从 V1 到 V2 存在一条路径,因此从 v1 到 v2 也存在一条路径,因为 V1 和 V2 中的所有节点都是强连通的。