我需要找到加權無向圖中每條邊的最短替代路徑,即假設我有一個egde(a,b)in一個圖表,那麼我想計算在直接路徑跳過的候選點a和b之間的最短路徑,即邊(a,b)。如果沒有替代路徑,那麼距離應該是無限的。我會爲圖的每個邊做這個。我試着用dijkstras算法(當遇到目標頂點時會破壞),但是需要太多時間來爲每個邊單獨計算路徑,特別是在沒有其他選擇的情況下路徑是可能的(在這種情況下,必須遍歷整個圖)。你能否提出其他解決方案?圖中不應該是邊的邊的頂點之間的最短路徑
回答
Here是我前段時間寫的dijkstra實現,它使用stl make_heap更有效地找到下一個節點。實施很可能是正確的。
編輯:在該示例中文件從讀取時,n
是頂點的數目,m
是邊數,a
和b
是邊緣的頂點,其方向是從a
到b
,c
是重量。
由於Nobody提到,您應該刪除邊緣,然後將其添加回來,以保持算法原樣。
我想我會做的是適應Dijkstra的算法,以便我最初填充堆長度/優先隊列長度爲2的所有路徑不使用該邊緣(感謝titus捕捉我以前的錯誤)。這樣,您得到的結果將排除只包含一個邊的路徑。結果會爲您獲取一切特定來源的所有信息,您可以在所有可能的來源中重複此操作。
我想你可能最終得到的結果是a-> c-> b,其中a-> c實際上是a-> b-> c。沒有?在添加所有長度爲2的路徑時,仍然需要注意不要使用a-> b。2 – titus 2012-08-09 17:48:25
啊,真的。 (我最初實際上是誤讀了這個問題,但是我認爲如果我們只是做了這個檢查就沒問題) – 2012-08-09 17:55:14
Dennis Meng
建議的解決方案是我想的。但是有一些優化(預處理)可以使你的實現更快。
將連接組件(樹)集中的圖分隔[提示:使用DFS查找連接的組件]。 - 通過這種方式,如果在
tree
節點u
中找不到對(u,v)對的最短路徑,那麼您可以跳出(內部)循環。維護每個節點與其對應的樹之間的映射。 - 這將在實現幫助第1步
你只需要在其上進行dijkstras之前,只需刪除從圖形目標邊緣.....
- 1. 彩色邊圖中的最短路徑
- 2. 具有頂點和邊緣成本的最短路徑算法
- 3. 找到頂點之間給定路線的最短路徑python
- 4. 最短路徑中使用的邊沿
- 5. 缺少給定邊的最短路徑
- 6. 具有彩色邊的加權圖中的最短路徑
- 7. 找到點與多邊形之間最長的「直線」路徑
- 8. 查找圖中一對節點之間的K-最短路徑?
- 9. 最有效的最短路徑算法非負邊緣圖
- 10. 訪問k個頂點的無向圖中的最短路徑
- 11. 找到從頭到尾頂點的圖中的最短路徑
- 12. 查找樹中多條路徑之間的常見最短邊界
- 13. K負邊緣 - 單源最短路徑
- 14. 找到圖中所有頂點之間的最短路徑而不給出開始點或結束點
- 15. 基於不同條件的圖中兩個節點之間的最短路徑
- 16. 有向圖中從一個頂點到另一個頂點的最短路徑
- 17. 的最短路徑上最重要的邊緣
- 18. 最短路徑不是圖中的路徑
- 19. 樹形圖 - 找到有多少對頂點,它們之間的路徑上的邊的總和是C
- 20. 座標系統中兩點之間的最短路徑
- 21. 圖中任意兩個節點之間的最長最短路徑
- 22. 二進制矩陣的兩點之間的最短路徑
- 23. 跨多個矩陣的節點之間的最短路徑
- 24. 在OrientDB的最短路徑中獲取邊緣()
- 25. 發現節點之間的最短路徑,以及圖形是否連接
- 26. 多點之間的最短路線
- 27. 在地圖中繪製2點之間的短路徑
- 28. 在特定點之間找到三維空間中最短(最快)的路徑
- 29. 我如何找到從一個點到該多邊形的多邊形上的最短點(不是距離)
- 30. 穿過不同點的最短路徑
你爲什麼不直接刪除圖中的「不允許」邊緣,然後運行Dijkstra或任何其他「正常」路徑查找算法? – Nobody 2012-08-09 17:08:55
如果Dijkstras花費太多時間,那麼我認爲你運氣不好。不要認爲現在有更好的算法。 – Egor 2012-08-09 17:11:42
當您找到要升級的下一個節點時,您的dijkstra實現是否使用最小堆?或者你只是遍歷所有的版本? – titus 2012-08-09 17:19:46