[英]How to add edges to a directed acyclic graph without creating cycles
我有一個帶有有向邊和無向邊的圖,現在我想通過用有向邊替換它們來擺脫無向邊(每個無向邊變成一個有向邊)。 每個無向邊都有兩種可能性(用一個方向或另一個方向的有向邊替換它)。
如何確定無向邊的方向以使我的圖保持無環?
我的做法:
創建一個僅包含有向邊的圖,稍后將無向邊 1 x 1(作為有向邊)添加。 現在我有一個DAG ,我的問題減少到在保持 DAG 屬性的同時向圖中添加有向邊(只有有向邊,沒有循環)。
如何向 DAG 添加邊並確保生成的圖也是 DAG?
使用您擁有的所有有向邊構建初始 DAG。 對它進行拓撲排序。 將排序所施加的偏序擴展為全序(例如,在級別格中排列頂點並逐級枚舉它們)。 請注意,所有邊都從較小的頂點到較大的頂點。
現在根據總順序(從較小的頂點到較大的頂點)引導您的無向邊。 很容易看出結果圖沒有循環(要存在循環,必須有一條向相反方向的邊)。
這對我有用:
對沒有無向邊的圖進行拓撲排序,將無向邊一條一條相加(使它們從較大的topo-vlalue指向較小的)。
這樣可以保證 DAG 在添加邊后仍將是 DAG。
@ user58697,無需擴展偏序,因為在對圖形進行拓撲排序后存在全序。 每個節點的拓撲值與其他拓撲值相當。
讓我們通過看一個例子來嘗試解決這個問題:-
假設我有以下一組頂點作為有向頂點:-
(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。
這就像一個蠻力解決方案。 讓我再考慮一下,有沒有更好的方法來解決這個問題。
在不創建循環的情況下添加到 DAG 的鏈接
toNode
。toNode
連接到圖中不在該toNode
子樹中的任何其他節點。它永遠不會產生循環。
基本思想是進行拓撲排序。
例如,在拓撲排序數組是 3,4,5,6,1,2 之后我們從 3 引導無向邊 -> 其他邊
之后做 4 次,然后 5 次,依此類推
這樣可以保證 DAG 在添加邊后仍將是 DAG。
完畢!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.