簡體   English   中英

圖中一條邊的頂點之間的最短路徑,該路徑不應該是邊本身

[英]Shortest path between vertices of an edge in a graph which should not be the edge itself

我需要找到加權無向圖中每個邊的最短替代路徑,即,假設我在圖中有一個egde(a,b),然后我要計算頂點a和b之間的最短路徑(跳過正向)路徑,即edge(a,b)。 如果沒有其他路徑,則距離應該是無限的。 我想對圖的每個邊緣執行此操作。我嘗試使用dijkstras算法(遇到目標頂點時會中斷),但要花費大量時間單獨計算每個邊緣的路徑,尤其是在沒有其他選擇的情況下路徑是可能的(在這種情況下,必須遍歷整個圖形)。 您可以為此提出任何其他替代解決方案嗎?

我想我會做的就是適應Dijkstra的算法,這樣一來,我最初會使用不使用該邊的所有長度為2的路徑填充堆/優先級隊列(感謝titus捕獲了我之前的錯誤)。 這樣,您獲得的結果將排除僅包含一條邊的路徑。 然后,結果為您提供了一個特定來源的所有信息,您可以在所有可能的來源上重復此操作。

是我前一段時間編寫的dijkstra實現,它使用stl make_heap更有效地查找下一個節點。 該實現很可能是正確的。
編輯:在從文件中讀取的示例中, n是頂點數, m是邊緣數, ab是邊緣頂點,方向是從abc是權重。
就像沒有人提到的那樣,您應該刪除邊緣,然后重新添加邊緣,以保持算法不變。

我會想到Dennis Meng建議的解決方案。 但是有一些優化(預處理)可以使您的實現更快。

  1. 將圖形隔離在一組連接的組件(樹)中[提示:使用DFS查找連接的組件]。 -這樣一來,如果您在具有節點utree中找不到(u,v)對的最短路徑,則可以擺脫(內部)循環。

  2. 維護每個節點與其對應的樹之間的映射。 -這將有助於實施第一步

您只需要在圖形上執行dijkstras之前簡單地從圖形中刪除目標邊緣即可。

暫無
暫無

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

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