經典的最短路演算法是dijkstra演算法,但是這個演算法有兩點缺陷。
1.一次dijkstra只能求單源的最短路徑,如果想要求任意兩點的距離,就要每乙個節點都進行一次dijkstra,很麻煩。
2.運用dijkstra演算法時,要求圖中不可以有負權的邊。
2是為何呢?可以看下圖
利用dijkstra演算法,求1-2最短路徑時,dist[1,2] = 3 但是實際上是2,即如果存在負權,就可能出現更新不了最短路的問題。嚴格證明不知道...舉反例看看吧..
為了解決上述兩個問題,引出了另乙個演算法,floyd演算法。
本質是一種動態規劃的思想。
(注意上圖中所說的幾個只要滿足 nodenum < k 即可,沒有固定的個數)
這樣一來,狀態轉移方程就有了:
那麼自然而然給出偽**:
floyd:floyd可以求任意兩點間距離,直接輸出distance[start][end]即可。for(int i = 0 ; i < vertices ; ++i)
for(int j = 0 ; j < vertices ; ++j)
distance[i][j] = cost[i][j];
for(int k = 0 ; k < vertices ; ++k)
for(int i = 0 ; i < vertices ; ++i)
for(int j = 0 ; j < vertices ; ++j)
distance[i][j] = min(distance[i][j],distance[i][k] + distance[k][j]);
/*其中k迴圈一定要在最外層,代表的是我們以經過第k個點為標準進行遍歷*/
但是floyd也有它的侷限性,它不可以用於存在負權環的情況存在。
如下圖:
在出現上圖這種情況的時候用floyd演算法distance[0][2]就不是2了,而是負無窮..
因為路徑 0,1,0,1,0,1.....,0,1,2的長度可以任意的小。
這種情況下只能用bellman—ford演算法了...
floyd 最短路演算法
floyd最短路徑演算法 在圖論中經常會遇到這樣的問題,在乙個有向圖裡,求出任意兩個節點之間的最短距離。我們在離散數學 資料結構課上都遇到過這個問題,在計算機網路裡介紹網路層的時候好像也遇到過這個問題,記不請了.但是書本上一律採取的是dijkstra演算法,通過dijkstra演算法可以求出單源最短...
最短路 Floyd演算法
1.定義概覽 floyd warshall演算法 floyd warshall algorithm 是解決任意兩點間的最短路徑的一種演算法,可以正確處理有向圖或負權的最短路徑問題,同時也被用於計算有向圖的傳遞閉包。floyd warshall演算法的時間複雜度為o n3 空間複雜度為o n2 2.演...
最短路 Floyd演算法
floyd演算法思想 1.初始化矩陣 i,j連線則矩陣的值為邊的代價,否則為max 2.計算 i 經過 k 到 j 的最短路徑map i,j min並儲存路徑 時間複雜度 o n 3 空間複雜度 t n 2 void floyd int n n為節點數,節點從1開始 例題 include inclu...