确定图形是否是半连接的
问题内容:
如果对于所有对顶点u,v中的v,我们有u-> v或v-> u路径,则称有向图G =(V,E)是半连接的。提供一种有效的算法来确定G是否为半连接
问题答案:
平凡的O(V^3)
解决办法是使用弗洛伊德warshal所有到所有的最短路径,但是这是一个矫枉过正(以时间复杂度)。
可以在中完成O(V+E)
。
要求:
DAG按拓扑结构半连接,每个i
都有一个边缘(vi,vi+1)
证明:
给定具有拓扑排序的DAG v1,v2,...,vn
:
如果(vi,vi+1)
某边没有边i
,则也就没有路径(vi+1,vi)
(因为它是DAG的一种拓扑结构),并且该图不是半连接的。
如果每个i
都有一条边(vi,vi+1)
,则每个i,j
(i
<j)都有一条路径vi->vi+1->...->vj-1->vj
,并且该图是半连接的。
由此我们可以得到算法:
- 在图中找到最大SCC
- 建立SCC图G’=(U,E’),使之
U
成为一组SCC。E'= {(V1,V2) | there is v1 in V1 and v2 in V2 such that (v1,v2) is in E)
- 对G’进行拓扑排序
- 检查每个i是否有边Vi,Vi + 1。
正确性证明:
如果该图是半连接的,那么对于一对(v1,v2)
,则存在一条路径v1->...->v2
-假设V1,V2为它们的SCC。由于V1和V2中的所有节点均已牢固连接,因此存在从V1到V2的路径,因此也有从v1到v2的路径。
如果算法得出的结果为true,则对于任何两个给定的节点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)
,因此有一个根。