答案 0 :(得分:17)
琐碎的O(V^3)
解决方案可能是使用floyd warshal全部到最短的路径,但这是一种过度杀伤力(就时间复杂度而言)。
可以在O(V+E)
中完成。
<强>要求:强>
DAG以拓扑排序半连接,对于每个i
,有一条边(vi,vi+1)
<强>证明:强>
给定拓扑排序为v1,v2,...,vn
的DAG:
如果某些(vi,vi+1)
没有边i
,那么也没有路径(vi+1,vi)
(因为它是DAG的拓扑类型),并且图形不是半连接的
如果每个i
都有一个边(vi,vi+1)
,那么对于每个i,j
(i
由此我们可以得到算法:
U
是一组SCC。 E'= {(V1,V2) | there is v1 in V1 and v2 in V2 such that (v1,v2) is in E)
正确性证明:
如果图表是半连接的,对于一对(v1,v2)
,有一条路径v1->...->v2
- 让V1,V2成为他们的SCC。从V1到V2的路径也是从v1到v2的路径,因为V1和V2中的所有节点都是强连接的。
如果算法产生了真,那么对于任何两个给定节点v1,v2 - 我们知道它们在SCC V1和V2中。从V1到V2有一条路径(不失一般性),因此也从v1到v2。
作为旁注,每个半连接图也有一个根(顶点r
导致所有顶点):
证明:
假设没有根。定义#(v) = |{u | there is a path from v to u}|
(具有从v
到它们的路径的节点数)。
选择a
,#(a) = max{#(v) | for all v}
。
a
不是根,因此有一些节点u
没有从a
到它的路径。由于图形是半连接的,因此意味着存在路径u->...->a
。但这意味着#(u) >= #(a) + 1
(所有节点都可以从a
和u
到达)。
与#(a)
的极大性相矛盾,因此存在根。
答案 1 :(得分:1)
Amit的soltuin完全描述了最有效的方法。我可能只是添加一个可以通过检查是否存在多个G'的拓扑顺序来替换步骤4。如果是,则图表不是半连接的。否则,图表是半连接的。这可以很容易地合并到Kahn's algorithm中以查找图的拓扑顺序。
另一种在二次时间内工作的效率较低的解决方案如下。
首先,构建另一个图形G *,它与原始图形相反。然后,对于G的每个顶点v,从G中的v运行DFS,并将可达节点集视为R_v。如果R_v!= V(G),则从G *中的v运行另一个DFS,并让可达节点集合为R _v。如果R_v和R _v的并集不是V(G),则图形不是半连接的。
答案 2 :(得分:0)
Amit 算法的第 3 步和第 4 步背后的主要思想是检查您的深度优先森林是否由多个深度优先树组成。单棵树的存在是半连通性的必要条件,因为多棵树代表不连通的节点。
类似的想法:哈密顿路径,最长路径长度