與前面寫的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 演算法...