如何判断为DAG添加边是否形成有向循环?

时间:2017-01-26 19:00:22

标签: algorithm directed-acyclic-graphs topological-sort sanity-check

假设我在图中的每个顶点v都有一个DAG和一个给定的拓扑顺序函数,当查看2个特定节点时:x,y我知道| top(x)-top(y)|< 10如何判断添加边x-> y是否会在图中形成一个循环? 我试图找到一个比O(V + E)更好的解决方案......

我认为只是检查top(x)>顶部(y),如果是,那么我们创建一个循环。 但是,我担心我可能会错过一个案例,而且| top(x)-top(y)|< 10是否会给我任何额外的信息?任何启示?

2 个答案:

答案 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) = 0top(v) = top(y) = 1以及top(x) = 2。连接x->y很方便,但top函数必须更改。

我们知道的是,如果已经有yx的路径,则中间节点的top小于x&# 39; s,所以我们可以在遍历时忽略其他节点。