假设我在图中的每个顶点v都有一个DAG和一个给定的拓扑顺序函数,当查看2个特定节点时:x,y我知道| top(x)-top(y)|< 10如何判断添加边x-> y是否会在图中形成一个循环? 我试图找到一个比O(V + E)更好的解决方案......
我认为只是检查top(x)>顶部(y),如果是,那么我们创建一个循环。 但是,我担心我可能会错过一个案例,而且| top(x)-top(y)|< 10是否会给我任何额外的信息?任何启示?
答案 0 :(得分:1)
我们可以使用|top(x) < top(y)| < 10
这一事实来找到有效的解决方案。
首先,请注意,如果top(x) < top(y)
没有循环。否则,让ar[] = y, z₁, z₂ … z_k, x
成为y和x之间拓扑排序的节点。如果存在从y到x的路径,则只能通过这些顶点。所以只需检查是否有路径:
haspath[] = {false}
haspath[1] = true
for i = 2 to k+2
for j = 1 to i-1
if haspath[j]==true and edge(ar[j],ar[i])
haspath[i] = true
break
如果haspath[k+2]
为真,则存在从y到x的路径。
答案 1 :(得分:0)
确实错过了一个案例。
>x
/
>v
/
r
\
>y
0 1 2
其中top(r) = 0
和top(v) = top(y) = 1
以及top(x) = 2
。连接x->y
很方便,但top
函数必须更改。
我们知道的是,如果已经有y
到x
的路径,则中间节点的top
小于x
&# 39; s,所以我们可以在遍历时忽略其他节点。