最短路演算法 Floyd基礎詳解

2022-09-01 18:33:12 字數 1331 閱讀 2821

經典的最短路演算法是dijkstra演算法,但是這個演算法有兩點缺陷。

1.一次dijkstra只能求單源的最短路徑,如果想要求任意兩點的距離,就要每乙個節點都進行一次dijkstra,很麻煩。

2.運用dijkstra演算法時,要求圖中不可以有負權的邊。

2是為何呢?可以看下圖

利用dijkstra演算法,求1-2最短路徑時,dist[1,2] = 3 但是實際上是2,即如果存在負權,就可能出現更新不了最短路的問題。嚴格證明不知道...舉反例看看吧..

為了解決上述兩個問題,引出了另乙個演算法,floyd演算法。

本質是一種動態規劃的思想。

(注意上圖中所說的幾個只要滿足 nodenum < k 即可,沒有固定的個數) 

這樣一來,狀態轉移方程就有了:

那麼自然而然給出偽**:

floyd:

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可以求任意兩點間距離,直接輸出distance[start][end]即可。

但是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...