我有一个带有有向和无向边的图,现在我想通过用有向边替换它们去除无向边(每个无向边成为一个有向边)。每个无向边有两种可能性(用一个方向或另一个方向的有向边代替)。
如何确定无向边的方向,以便我的图形保持非循环?
我的方法:
创建仅包含有向边的图形,稍后逐步添加无向边(作为有向边)。现在我有一个DAG,我的问题是减少向图中添加有向边,同时保持DAG属性(只有有向边,没有周期)。
如何向DAG添加边缘并确保结果图也是DAG?
答案 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的链接而无需创建循环
toNode
。toNode
连接到图形中不在该toNode
的子树中的任何其他节点。它从不创建循环。
答案 4 :(得分:0)
基本思想是进行拓扑排序。
例如在拓扑排序数组为3,4,5,6,1,2之后
我们从3->其他边引出无方向的边
之后,先执行4次,然后执行5次,依此类推
通过这种方式,可以确保DAG在添加边后仍将保留在DAG中。
答案 5 :(得分:0)
完成!