簡體   English   中英

如何在不創建循環的情況下向有向無環圖添加邊

[英]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 的鏈接

  1. 在 DAG 中隨機選擇一個新鏈接將指向的節點。 讓它成為一個toNode
  2. toNode連接到圖中不在該toNode子樹中的任何其他節點。

它永遠不會產生循環。

基本思想是進行拓撲排序。

例如,在拓撲排序數組是 3,4,5,6,1,2 之后我們從 3 引導無向邊 -> 其他邊
之后做 4 次,然后 5 次,依此類推

這樣可以保證 DAG 在添加邊后仍將是 DAG。

  1. 按拓撲順序對節點進行排序
  2. 在不存在邊的“右側”創建從每個節點到節點的邊

完畢!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM