1. 程式人生 > >Dijkstra演算法不能處理負權邊的解釋

Dijkstra演算法不能處理負權邊的解釋


Dijkstra演算法不能處理負權邊,剛開始我只知道有這麼個說法,但是卻沒有例項證明,這次成功證明,看上面這個圖,現在要算出A到D的最短路徑,通過Dijkstra演算法首先鬆弛出B,C,B最短,然後把B的出邊進行鬆弛,B被標記為處理過,然後再次選出C,對C的出邊進行鬆弛,此時B雖然進行了鬆弛,但是前面已經被標記處理過了,所以最後算出來的最短路徑為35,但是實際上最短路徑為33,那就使用貝爾曼-福德演算法吧。

因為Dijkstra是這樣假設的:對於處理過的結點,沒有前往該結點的更短路徑,這種假設僅僅在沒有負權邊時才能成立。