爲什麼我們不能將Dijkstra算法應用於負權重圖?爲什麼我們不能將Dijkstra算法應用於負權重的圖形?
回答
從A到B找到最便宜的路徑是什麼意思?如果您每次從C到D旅行,都會得到付費?
如果兩個節點之間存在負權重,那麼「最短路徑」將永遠在這兩個節點之間向後和向前循環。路徑越短,路徑越短。
這與算法無關,而且都與這種回答不可能性有關。
編輯:
上述權利要求假定雙向鏈路。如果沒有整體負面的體重週期,你沒有辦法永遠循環,獲得報酬。
在這種情況下,Dijkstra算法仍可能會失敗:
考慮兩個路徑:
- 該架向上的100成本,穿越其具有-25的最終邊緣之前的最佳路徑重量,給出總共75和
- 已經沒有與90
Dijkstra算法的總成本負加權邊緣的次優路徑將不變擬首先找到次優路徑,並在發現它時宣佈自己完成。它不會跟隨比找到的第一個解決方案更差的子路徑
但是 - 只要沒有負重量循環,Bellman-Ford在負重力邊緣的情況下都能正常運行。所以有一些關於Dijkstra的算法會導致它失敗,即使你不能在一個負的權重循環中的兩個節點之間循環。 – dsolimano 2010-12-06 06:23:57
@dsolimano:是的。考慮兩條路徑:(1)一條最優路徑,其總成本爲100,在穿過具有-25重量的最終邊緣之前,總共爲75,以及(2)不具有負加權的次優路徑邊的總成本爲90.迪傑斯特拉算法將首先調查次優路徑,並在發現它時宣佈自己完成。它永遠不會跟隨比找到的第一個解決方案更糟糕的子路徑。 – Oddthinking 2010-12-08 14:21:31
@Oddthinking:所以你知道實際的答案(是的,它與算法有關),所以你應該從評論到答案文本推廣它。 – 2012-10-15 09:50:49
想象一下,您有一個有向圖,其中有一個有向循環,並且圍繞該距離的總「距離」爲負權重。如果在從開始到結束頂點的路上,您可以通過該定向循環,則可以簡單地在定向循環周圍繞過任意次數。
這意味着你可以讓你穿過圖的路徑有一個無限的負距離(或有效地)。
但是,只要你的圖形周圍沒有定向週期,你就可以脫離使用Dijkstra算法,而不會有任何爆炸。
所有的說法,如果你有一個負權重圖,你可以使用Belman-Ford算法。但是,由於這種算法的普遍性,它有點慢。 Bellman-Ford算法需要O(V·E),其中Dijkstra的時間爲O(E + VlogV)時間
我會給你一個反例。請考慮以下圖
http://img853.imageshack.us/img853/7318/3fk8.png
假設你在頂點A
開始,要D
最短路徑。Dijkstra算法會做以下步驟:
- 所訪問,並添加頂點
B
和C
排隊 - 以最小距離隊列頂點獲取馬克
A
。它是B
- 標記
B
作爲訪問和添加頂點D
隊列。 - 從隊列中提取。不是頂點
D
。 - 馬克
D
所訪問
的Dijkstra說從A
到D
最短路徑長度爲2,但它顯然是不正確的。
- 1. Dijkstra的負重算法
- 2. 負重的Dijkstra算法
- 3. Dijkstra的負權重算法(但沒有負循環)
- 4. Dijkstra算法 - 僅來自源的負權
- 5. Dijkstra算法VS A *對於權圖
- 6. Dijkstra的算法應該返回什麼?
- 7. 我的Dijkstra算法有什麼問題
- 8. 爲什麼我的Dijkstra算法在Java中實現無向圖不起作用?
- 9. Dijkstra的算法無法處理負面權重,您何時在現實世界中看到負面權重?
- 10. 如果Dijkstra算法運行在負權重週期的有向圖上,會發生什麼情況?
- 11. 爲什麼我們不能重寫`||`和`&&`?
- 12. 如何使Dijkstra的算法適用於加權圖
- 13. 爲什麼我們不能使用O-Notation來比較算法?
- 14. 如何將Dijkstra算法應用到我的鄰接圖?
- 15. Dijkstra是否適用於非負面或正面權重?
- 16. 爲什麼我們不能得到一個特定的負數
- 17. 爲什麼使用Dijkstra算法而不是Best(Cheapest)First Search?
- 18. 什麼是最有效的方式來表示Dijkstra的算法的邊權重
- 19. 在應用Dijkstra算法之前,是否值得修剪圖形?
- 20. 什麼是Dijkstra算法中的INT_MAX?
- 21. 爲什麼kruskal算法和dijkstra算法如此相似?
- 22. 爲什麼我不能重用「不應用」不重複的方法簽名
- 23. 爲什麼我們在負載使用TRUE的視圖,笨
- 24. 爲什麼Dial版本的Dijkstra算法中使用雙鏈表?
- 25. 爲什麼我不能將CSS3列應用於此文本?
- 26. Minimax算法:爲什麼評分爲負?
- 27. 爲什麼我們不能應用JLS中包含的保證?
- 28. 我們爲什麼要將ClassInterface屬性應用於類?
- 29. 爲什麼我們不能使用朋友函數重載「=」?
- 30. 爲什麼Dijkstra算法需要使用deleteMin()和decreaseKey()?
這個問題更適合math.stackexchange.com。因此,我建議將其重新安置。 – 2013-11-07 23:01:04