簡體   English   中英

具有未使用邊的循環檢測無向圖

[英]cycle detection undirected graph with unused edges

我有一個帶邊的無向圖。 每條邊都具有某些屬性,例如點 A 和點 B 之間的邊之一是

{
travelTime :10hours
travelPath : air
}

C點和D點之間的另一個可能是

{
travelTime :1hours
travelPath : Metro
} 

我們得到了這樣一個圖和已知的旅行路徑

 {air, Metro,Rail, Bus ,Auto,Rickshaw  }

一組邊說 unUsedEdges 不是固定圖的一部分提供給我們。 它們也具有上述性質,只是它們不屬於固定圖。 現在在這個固定圖中添加了一條來自 unUsedEdges 的邊。 我們必須知道是否有一個只有地鐵和鐵路類型的循環,其中包括這個新引入的邊緣。 然后刪除新引入的邊,我們檢查 unUsedEdges 中的另一條邊。 如果存在循環,我們需要循環邊。 我們需要來自所有 unUsedEdges 邊的所有循環。

固定圖很大。 unUsedEdges 集也很大。 我們可以使用 DFS 在 O(V+E) 時間內檢測無向圖中的循環。 對所有未使用的邊緣重復執行此操作需要時間。

有更快的方法嗎?

由於您只想檢測地鐵或鐵路邊緣的循環,我們可以通過首先僅使用地鐵邊緣運行算法來簡化問題,然后僅使用鐵路邊緣。 因此,一種在沒有不同邊緣類別的情況下工作的算法可以很容易地適應整個問題。

可以使用不相交集數據結構的變體來解決減少的問題。 我們可以將固定邊插入數據結構,然后查詢(不插入)每條新邊。 這告訴我們循環是否存在,但如果我們想恢復循環,我們需要擴充數據結構。

在數據結構中維護兩個父指針數組:一個正常用於使用路徑壓縮的不相交並集數據結構,另一個不使用路徑壓縮。 沒有路徑壓縮的必須保持不變屬性,即父指針樹中的每個(有向)邊都是原始圖的(無向)邊; 這意味着有時需要翻轉邊的方向以便為聯合操作重新生成樹的根。

在測試非固定邊時,我們使用路徑壓縮數組來查詢是否存在循環,如果存在,我們通過跟隨另一個數組中的兩個頂點到它們在父指針樹中的最低共同祖先來恢復它。 這是可行的,因為未壓縮數組中的邊都是來自原始固定圖的邊,並且可以從該邊加上從其每個頂點到共同祖先的兩條路徑形成包括未固定邊的循環。

總運行時間在最壞情況下為 O( m α( v ) + v ² + nv ),其中v是頂點數, m是固定邊數, n是非固定邊數,並且α 是增長非常緩慢的反阿克曼函數

  • m α( v ) 項是 O( m ) 在聯合查找數據結構上“查找”查詢的成本。 還有另一個 O( n ) 執行的“查找”查詢,但這些查詢的術語由nv主導。

  • v ² 項是在未壓縮數組中重新生成樹的成本高達 O( v ) 次,在最壞的情況下每次都翻轉到 O( v ) 條邊。

  • nv項是最壞情況下輸出的大小; 最多可以有n個循環,每個循環的長度最多為v 如果大多數不固定邊不創建循環,和/或循環通常相對於v較短,則運行時間會明顯加快。 從這個意義上說,該算法對輸出敏感

暫無
暫無

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

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