Floyd演算法模板(C語言)
阿新 • • 發佈:2021-01-04
Floyd演算法
Floyd演算法又稱為插點法,是一種利用動態規劃的思想尋找給定的加權圖中多源點之間最短路徑的演算法,與Dijkstra演算法類似。
演算法過程
1.從任意一條單邊路徑開始。所有兩點之間的距離是邊的全,如果兩點之間沒有邊相連,則權為無窮大。
2.對於每一對頂點u和v,看看是否存在一個頂點w使得從u到w再到v比已知的路徑更短。如果是則更新它。
Floyd演算法適用於APSP(All Pairs Shortest Paths,多源最短路徑),是一種動態規劃演算法,稠密圖效果最佳,邊權可正可負。此演算法簡單有效,由於三重迴圈結構緊湊,對於稠密圖,效率要高於執行|V|次Dijkstra演算法,也要高於執行|V|次SPFA演算法。
時間複雜度 : O ( n 3 ) O(n^3) O(n3)
空間複雜度: O ( n 2 ) O(n^2) O(n2)
程式碼如下:
#include <stdio.h>
#include <string.h>
#include <math.h>
const int N = 1010, INF = 1e9;
int n, m;
int dist[N][N]; //dist[i][j]表示從i到j點的最短距離
void floyd(){
for(int k = 1; k <= n; k++){
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++){
dist[i][j] = fmin(dist[i][j], dist[i][k] + dist[k][j]);
}
}
}
}
int main(void){
int a, b, c;
scanf("%d %d", &n, &m);
//初始化
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++){
dist[i][j] = i == j ? 0 : INF;
}
}
for(int i = 0; i < m; i++){
scanf("%d %d %d", &a, &b, &c);
dist[a][b] = fmin(dist[a][b], c);
}
floyd();
if(dist[1][n] == INF) puts("-1");
else printf("%d\n", dist[1][n]);
return 0;
}