如何在不创建循环的情况下将边添加到有向非循环图

时间:2017-05-14 16:56:08

标签: java algorithm graph directed-acyclic-graphs

我有一个带有有向和无向边的图,现在我想通过用有向边替换它们去除无向边(每个无向边成为一个有向边)。每个无向边有两种可能性(用一个方向或另一个方向的有向边代替)。

如何确定无向边的方向,以便我的图形保持非循环?

我的方法:

创建仅包含有向边的图形,稍后逐步添加无向边(作为有向边)。现在我有一个DAG,我的问题是减少向图中添加有向边,同时保持DAG属性(只有有向边,没有周期)。

如何向DAG添加边缘并确保结果图也是DAG?

6 个答案:

答案 0 :(得分:1)

让我们试着通过一个例子来解决这个问题: -

假设我有以下顶点集: -

(1,2)
(2,3)
(4,5)
(5,6)
(7,3)

我们跟随一组具有无向顶点的顶点: -

(3,4)
(6,7)

现在,如果我们在纸上创建图表,它应该看起来像这样

1 -> 2 -> 3 
         /  \
        /  4   -> 5 -> 6
       /              /  \
     -----------------7 

因此,您可以清楚地看到存在两个无向边缘,我们希望用定向边缘替换它们,

因此我们可以选择第一个无向对(3,4)并放置一个顶点3 - > 4然后我们将调用dfs(1),如果找到一个循环然后(3,4)不是有效的,我们将放置为4 - > 3但在我们的情况下3 - > 4不会导致任何循环。

我们转到我们的下一对叫做(6,7)并放置6 - > 7导致一个循环,所以我们放置7 - > 6这给了我们一个DAG。

这就像一个强力解决方案。让我更多地考虑一下,有没有更好的方法解决这个问题。

答案 1 :(得分:1)

使用您拥有的所有有向边构建初始DAG。拓扑它。将通过排序强加的部分顺序扩展到总顺序(例如,在级别点阵中排列顶点并逐级枚举它们)。请注意,所有边都从较小的顶点变为较大的顶点。

现在根据总顺序(从较小的顶点到较大的顶点)引导您的无向边。很容易看出结果图没有循环(对于一个循环存在,必须有一个边沿相反的方向)。

答案 2 :(得分:0)

这对我有用:

在没有无向边的图上进行拓扑排序,逐个添加无向边(使它们从较大的topo-vlalue指向较小)。

这样可以保证在添加边缘后DAG将保持DAG。

@ user58697,不需要扩展部分顺序,因为在拓扑排序图之后存在总顺序。每个节点的拓扑值与其他拓扑值相当。

答案 3 :(得分:0)

添加到DAG的链接而无需创建循环

  1. 在DAG中选择一个随机节点,新链接将直接指向该节点。让它成为toNode
  2. toNode连接到图形中不在该toNode的子树中的任何其他节点。

它从不创建循环。

答案 4 :(得分:0)

基本思想是进行拓扑排序。

例如在拓扑排序数组为3,4,5,6,1,2之后 我们从3->其他边引出无方向的边
之后,先执行4次,然后执行5次,依此类推

通过这种方式,可以确保DA​​G在添加边后仍将保留在DAG中。

答案 5 :(得分:0)

  1. 按拓扑顺序对节点进行排序
  2. 在不存在边的“右侧”创建从每个节点到节点的边

完成!