簡體   English   中英

連接有向無環加權圖中的兩個隨機節點

[英]Connecting Two Random Nodes in a Directed Acyclic Weighted Graph

概括

所以我有一個有向無環加權圖,其中每條邊都有一個輸入和輸出節點,每個節點都有一個 ID,我使用字典將所有傳入邊通過其 ID 映射到一個節點,另一個對所有傳出邊執行相同操作當呈現節點 ID 時,我可以在 ~O(1) 時間內告訴所有傳入和傳出邊緣。

要求

我需要能夠以一種方式添加新的隨機邊(即連接兩個隨機節點),以保證無論圖形有多大,它都不會有任何循環。

我試過的

由於我可以完全控制如何構建我的圖,我可以對其進行拓撲排序並使用卡恩算法來確定對於兩個均勻隨機選擇的節點 N1 和 N2,該圖是否會導致 O(n) 時間的循環。 問題是如果這樣做呢? 我必須嘗試一個新的隨機對並重復這個過程,直到我幸運為止。 這聽起來好像它會隨着圖的縮放非常糟糕,因為圖的邊越密,新的隨機圖就越有可能創建一個循環。

我還閱讀了這篇文章: 生成隨機 DAG ,這在本質上與我的問題相似,但是,我無法使用建議的解決方案根據節點的 ID 連接節點,只能將較小的 ID 連接到較大的 ID(之前出現的節點)節點是新的)由於我對問題的其他限制。

有沒有辦法設計一種結構,它只允許我在節點之間隨機選擇,如果通過新的邊連接,沒有一個節點會產生與內存開銷無關的循環? 這應該是一個 O(1) 操作。

我有一個O(1)解決方案來檢查圖中是否可以包含一條邊。 但是,插入邊緣需要最壞情況的O(n)

您可以維護一個二元可達性矩陣R ,其中R[u, v]=1如果您可以從當前圖中的u到達v ,否則R[u, v]=0 R可以使用Floyd-Warshall計算一次。

如果您想檢查是否可以包含邊(u,v)您現在只需檢查是否R[v, u] = 0 如果它是R[v, u] = 1您正在通過插入(u,v)構建一個圓。

剩下的問題就是更新這個結構。 如果您最終將邊(u, v)插入圖中,您將設置R[u, v] = 1 此外,所有能夠到達u ( R[:,u]=1 ) 的節點現在都能夠到達v ( R[v,:] = 1 ) 所能到達的所有節點。 因此R[i, j] = 1如果R[i,u] = 1R[v:j] = 1 R[i, j] = 1您將需要設置您的條目R[i, j] = 1 R[v:j] = 1

不幸的是,在最壞的情況下,更新步驟將花費 O(n)

如果要隨機選擇一條可能的邊,則必須另外維護和更新通過相同結構的可能邊列表。

暫無
暫無

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

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