我想知道是否有可能使用Dijkstra算法在有向非循環路徑中查找最長路徑。我知道,由於負成本週期,在一般圖中找不到Dijkstra最長的路徑。但我認爲它應該在DAG中運作。通過Google,我發現了很多相沖突的來源。有人說它有效,有人說它不起作用,但我沒有找到證據或反例。有人能指點我一個證明或反例嗎?Dijkstra在DAG中的最長路徑
回答
我想到了這個問題,我認爲這是不可能的。我認爲,非循環是不夠的。
例如:
我們想在這個dag中從a到c。
a - > b - > c
| /\
v |
d - - - - -
DC的長度爲4
廣告長度爲1
所有其他人都長2
如果你只是用max函數替換min函數,算法將導致ABC但最長的路徑是adc。
我發現了兩個特殊的情況下,您可以使用Dijkstra算法計算最長路徑:
- 該圖不僅向無環,也是非週期性如果刪除了方向。換句話說:它是一棵樹。因爲在一棵樹中最長的路徑也是最短的路徑。
- 該圖只有負權重。然後,您可以使用max而不是min來查找最長的路徑。但是這隻有在權重真的是負數時才起作用。如果你只是反轉正面權重,它將無法正常工作。
實際上,對於(2)你不能有負的權重,這就像試圖簡單地尋找最大值(反轉比較)。你需要找到一個至少等於最大重量的值,然後爲每個重量:weight = max_weight - weight。然後一個正常的迪克斯特拉會給你返回最長的路徑。只需做path_length * max_weight - dist即可獲得該距離。 – Wernight
你能解釋一下這個部分嗎?「如果你用最大函數代替min函數,算法會導致a-b-c,但最長的路徑是a-d-c。」。首先從隊列中提取節點a,更新它的鄰居,然後提取節點b,然後c,因爲c的dist值是2,它大於b,那麼當c已經被訪問時,d和d不會更新c的dist? ??????? –
唯一的要求是不要有負循環。如果你沒有這些週期,那麼你可以通過從負權重中加入所有權重的最高絕對值來重新映射負值。這樣你就會失去負面的力量,因爲所有的重量都將等於或大於零。因此,總結一點,唯一擔心的是沒有一個負面循環。
這會扭曲路徑的長度,因爲負循環意味着負無窮作爲通過循環可以到達的任何節點的距離,而之後每個距離都是非負數。此外,路徑中的邊的數量將支配它的長度,這顯然不是當邊可以具有權重時的意圖。 –
是有三種可能的方式應用Dijkstra算法,它們都將無法工作:
1.Directly使用「最大」操作,而不是「分」的操作。
2.將所有正面權重轉換爲負值。然後找到最短的路徑。
3.給出一個非常大的正數M.如果一個邊的權重是w,現在用M-w代替w。然後找到最短的路徑。
對於DAG,關鍵路徑法將工作:
1:找到一個拓撲排序。
2:找到關鍵路徑。
見[霍洛維茨1995] E. Howowitz,S.薩尼和D.梅塔,在C數據結構++基礎,計算機科學出版社,紐約,1995年
我建議你修改Dijkstra算法取倒邊緣重量的值。由於該圖是非循環的,因此該算法不會進入無限循環,使用負權重來保持優化。更重要的是,現在積極的權重變成負數,但是,再次,沒有周期。如果您不允許重新插入訪問節點(即停止兩個節點之間的無止境跳轉,因爲添加負值始終會更好),即使圖形爲但無向也是如此。
最長距離問題沒有最優子爲任何圖形,DAG或沒有。然而,圖G上的任何最長距離問題等價於變換圖G'= - G中的最短距離問題,即每個邊權重的符號相反。
如果變換圖G'預計具有負邊和週期,那麼Bellman-Ford算法用於尋找最短距離。然而,如果G保證只有非負權重(即G'是非正權重),那麼Dijkstra的算法可能是比Bellman-Ford更好的選擇。 (見'Evgeny Kluev'對於graph - Dijkstra for The Single-Source Longest Path的迴應)如果G是一個DAG,那麼G'也將是一個DAG。對於DAG,我們有更好的算法來尋找最短距離,應該選擇Dijkstra或Bellman-Ford的算法。
總結:
最長路徑問題沒有最優子,因此在Dijkstra算法修改分鐘權重函數到最大權重函數不會單獨一個圖的工作,無論是DAG或沒有。相反,修改任何最短路徑算法(以及在一個平凡的方式),我們寧可改造G,看看哪些最短路徑算法效果最好的轉化G.
注意
A-------B
| | assume: edges A-B, B-C, C-A of same weight
| |
+-------C
我們看到MAX_DIS(A,B)= A-> C->乙
對於 「MAX_DIS」 是最佳的結構中,在上述情況下,關係
MAX_DIS(A,B) = MAX_DIS(A,C) + MAX_DIS(C,B) should be satisfied.
但是,它不是我們所看到的,MAX_DIS(A,C)= A-> B-> C和MAX_DIS(C,B)= C-> A-> B,因此它提供了一個例子,最長距離問題可能不會有最佳的子結構。
- 1. Dijkstra的算法 - 只有負成本的DAG最短路徑
- 2. DAG最短路徑
- 3. Dag的最短路徑
- 4. Dijkstra的最短路徑,HackerRank
- 5. DAG中的關鍵路徑和最長路徑是否有區別?
- 6. 最短路徑Dijkstra Java
- 7. Neo4j 2.2.5 - Dijkstra最短路徑
- 8. 最長是如何增加子序列DAG中最長路徑的特例?
- 9. 具有更新的節點加權DAG和最長路徑
- 10. 使用R igraph加權DAG的最長路徑
- 11. 從源節點上查找DAG上的最長路徑
- 12. Dijkstra最短路徑與最小步驟
- 13. NetworkX找到DAG中最長路徑的最有效方法,無錯誤
- 14. AFP Dijkstra的最短路徑算法
- 15. dijkstra的最短路徑算法回溯?
- 16. Dijkstra找到最短路徑的算法?
- 17. 使用Dijkstra算法的最短路徑
- 18. Dijkstra的最短路徑算法修改
- 19. Dijkstra的算法最短路徑
- 20. 使用Dijkstra的多條最短路徑
- 21. Dijkstra的連通圖最短路徑
- 22. Dijkstra無向圖的最短路徑
- 23. Dijkstra的最短路徑算法問題
- 24. 最長路徑
- 25. sna:修改Dijkstra算法(最短路徑)
- 26. Dijkstra算法尋找最短路徑
- 27. 增量Dijkstra或最短路徑算法?
- 28. Dijkstra VertexList的最短路徑= ListS在升壓圖中
- 29. Deduce最長的路徑
- 30. Dijkstra:在有向圖中查找最短路徑
看起來像它的工作,如果我看看這種方法[最長路徑問題](http://en.wikipedia.org/wiki/Longest_path_problem#Weighted_directed_acyclic_graphs),但你不相信? – yosukesabai
@yosukesabai您指出的算法不是Dijkstra算法。 – punkyduck