我有一個有向圖,除了離開源(S)的邊之外,它有所有非負邊。從源的任何其他頂點都沒有邊。要找到圖中源(S)到頂點(T)的最短距離,即使離開源的邊是負數,我也可以使用Dijkstra的最短路徑算法嗎?我可以在圖中使用Dijkstra的最短路徑算法嗎?
回答
假設只有源面 - 邊緣邊緣可以具有負權重,並且沒有路徑從任何源面 - 節點節點返回到源面(如註釋中所述),則可以在所有邊緣上添加常量C來源使它們都是非負面的。然後從最終結果中減去C。
在更一般的說明中,在應用Johnson's reweighting algorithm(本質上是Bellman-Ford,但需要僅執行一次)之後,Dijkstra可用於解決任何具有負邊權重(但無負循環)的圖中的最短路徑)。
你一般不能將Dijkstra算法用於帶有負向鏈接的(有向)圖的原因是Dijkstra的算法很貪婪。它假設一旦你選擇一個最小距離的頂點,就沒有辦法通過更小的路徑到達以後的。
在您的特定圖形中,在第一步之後,您將遍歷所有可能的負邊,並且從現在開始Dijkstra的假設實際上保持不變。無論現在直接連接的頂點現在具有負值,一旦確定哪個頂點具有最小距離,就再也無法以更小的距離再次到達頂點(因爲從此點開始遍歷的所有邊將具有正值距離)。
是的,您可以在該類型的有向圖上使用Dijkstra。
如果您已經完成了對Dijsktra的alghoritm並且它不能使用負值,那麼找到最低的負邊並將該數添加到所有起始邊是一種很好的做法,因此根本沒有負數。完成後你減去這個數字。如果你自己編碼(這非常簡單,我推薦給你),你幾乎不會改變任何東西,只需從最低值開始(像Dijkstra一樣)並允許它,最低值可以是負。它會在你的情況下工作。
@NiklasB。 - 沒有負面循環,看問題的評論。 – libik
我現在看到了,謝謝 –
如果您考慮dijkstra的算法將算法放在邊緣以使算法工作的條件,那麼只有在初始化後它們永遠不會減少。
因此,如果第一步是負數,那麼實際上並不重要,因爲從這幾個點開始,函數會不斷增加,從而找到正確的輸出(如果沒有辦法返回起始平方)。
好的一點,我其實並沒有想到這個,但我認爲「我會認爲是正確的輸出」,我認爲這是正確的(如果沒有最短路徑,是正確的輸出)。我正確地思考這個問題嗎? –
原來,OP明確排除了從任何相鄰節點回到源的路徑的可能性,因此不會有涉及源的週期。我現在意識到了 –
- 1. 使用Dijkstra算法的最短路徑
- 2. 我可以使用Dijkstra的最短路徑嗎?
- 3. AFP Dijkstra的最短路徑算法
- 4. dijkstra的最短路徑算法回溯?
- 5. Dijkstra找到最短路徑的算法?
- 6. Dijkstra的最短路徑算法修改
- 7. Dijkstra的算法最短路徑
- 8. Dijkstra的最短路徑算法問題
- 9. sna:修改Dijkstra算法(最短路徑)
- 10. Dijkstra算法尋找最短路徑
- 11. 增量Dijkstra或最短路徑算法?
- 12. 使用Dijkstra算法的2d數組中的最短路徑?
- 13. 使用紅/黑樹實現Dijkstra的最短路徑算法?
- 14. Dijkstra的最短路徑,HackerRank
- 15. 的最短路徑指數來,我被要求找出一種圖形,其總的最短路徑(使用Dijkstra算法)數量的節點(Dijkstra算法)
- 16. 使用Dijkstra的多條最短路徑
- 17. 我可以使用Prim的算法而不是Dijkstra的尋找最短路徑嗎?
- 18. 使用Dijkstra算法尋找最短路徑
- 19. Dijkstra的連通圖最短路徑
- 20. Dijkstra無向圖的最短路徑
- 21. 最短路徑Dijkstra Java
- 22. Neo4j 2.2.5 - Dijkstra最短路徑
- 23. 如何限制最短路徑 - dijkstra算法的最大代價?
- 24. 我可以在定向循環圖中使用Dijkstra算法獲得最長路徑嗎?
- 25. Dijkstra算法計算N條最短路徑
- 26. 如何返回n最佳最短路徑(dijkstra算法)
- 27. Dijkstra的最短路徑算法是行不通的
- 28. Dijkstra的算法 - 只有負成本的DAG最短路徑
- 29. Dijkstra的算法不會生成最短路徑?
- 30. Dijkstra std :: priority_queue的最短路徑算法性能vs std :: set
你可以從節點S1通過負邊到節點S2,然後通過另一個負邊回到S1?或者當你開始時,你不能回到起始節點S1? – libik
由於沒有任何其他頂點到源的邊,我不能從圖中的任何其他節點返回源。 – Neel
這意味着,從起始節點到其他節點的邊緣總是有方向的,對嗎? – libik