Floyd 演算法 只有5行的演算法

2021-08-22 10:39:12 字數 1274 閱讀 9620

與前面寫的dijkstra都是關於最短路徑的演算法,但是不同的是dijkstra演算法是計算單源最短路徑的演算法,也就是只能計算出乙個點到其他點的最短路徑,floyd演算法是多源最短路徑演算法,可以計算出任意兩點的最短路徑。

在講floyd之前先想乙個問題 假設我們已經存入了乙個圖(如下),我們怎麼縮短兩點之間的距離呢?顯而易見只能找中間點來作為轉接點,從而達到縮短距離。這個中間點有可能是乙個,有可能是兩個,有可能是更多。

我們先以1作為中間點看能不能縮短其中的一些路徑1

2341

0264

2∞03

∞37∞

0145

∞120經過** 果然有三個點縮短了

for (i=1;i<=n;i++)

for (j=1;j<=n;j++)

if (map[i][j] > map[i][1] + map[1][j])

map[i][j] = map[i][1] + map[1][j]

12

3410

2642

∞03∞

3790

1457

110那我們讓他以1 和 2 為中間點是不是也能縮短?那就是在1 的基礎上再判斷

for (i=1;i<=n;i++)

for (j=1;j<=n;j++)

if (map[i][j] > map[i][1] + map[1][j])

map[i][j] = map[i][1] + map[1][j]

for (i=1;i<=n;i++)

for (j=1;j<=n;j++)

if (map[i][j] > map[i][2] + map[2][j])

map[i][j] = map[i][2] + map[2][j]

經過判斷又有2個點縮短了12

3410

2542

∞03∞

3790

1457

100那麼我們讓所有的點都當作轉接點來判斷就是floyd演算法,完整**如下:

#include#define maxn 999999;

int map[100][100];

void floyd(int n)

void init(int n)

int main ()

floyd演算法的理解

floyd演算法適用於apsp all pairs shortestpaths,多源最短路徑 是一種動態規劃方法 對於稠密圖 點的密集度高 執行效率要高於dijkstra和spfa演算法,這種方法是用二維數 組來儲存點與點之間的距離,所以不適合有大量的點,就像點i到點j之間的距離就儲存 在map i...

Floyd演算法思想

本來 量如此小的演算法不用出模板了,但是的確思想還是很好的。1.定義概覽 floyd warshall演算法 floyd warshall algorithm 是解決任意兩點間的最短路徑的一種演算法,可以正確處理有向圖或負權的最短路徑問題,同時也被用於計算有向圖的傳遞閉包。floyd warshal...

Floyd演算法簡介

演算法定義 floyd warshall演算法 floyd warshall algorithm 是解決任意兩點間的最短路徑的一種演算法,可以正確處理有向圖或負權的最短路徑問題,同時也被用於計算有向圖的傳遞閉包。floyd warshall演算法的時間複雜度為o n 3 空間複雜度為o n2 演算法...