Floyd演算法求多源最短路
阿新 • • 發佈:2020-08-12
分析: f[i, j, k]表示從i走到j的路徑上除i和j點外只經過1到k的點的所有路徑的最短距離。那麼f[i, j, k] = min(f[i, j, k - 1), f[i, k, k - 1] + f[k, j, k - 1]。
因此在計算第k層的f[i, j]的時候必須先將第k - 1層的所有狀態計算出來,所以需要把k放在最外層。
讀入鄰接矩陣,將次通過動態規劃裝換成從i到j的最短距離矩陣
在下面程式碼中,判斷從a到b是否是無窮大距離時,需要進行if(t > INF/2)判斷,而並非是if(t == INF)判斷,原因是INF是一個確定的值,並非真正的無窮大,會隨著其他數值而受到影響,t大於某個與INF相同數量級的數即可
#include <bits/stdc++.h> using namespace std; const int N = 220, M = 20020, INF = 1e9; int g[N][N]; int m, n, Q; void floyd() { for(int k = 1; k <= n; k++) { for(int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++) { g[i][j] = min(g[i][j],g[i][k] + g[k][j]); } } } }int main() { scanf("%d%d%d",&n,&m,&Q); for(int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++) { if(i == j) g[i][j] = 0; else g[i][j] = INF; } } while(m -- ) { int a, b , c; scanf("%d%d%d",&a,&b,&c); g[a][b]= min(g[a][b],c); } floyd(); while(Q -- ) { int a, b; scanf("%d%d",&a,&b); int t = g[a][b]; if(t > 0x3f3f3f3f / 2) puts("impossible"); else printf("%d\n",t); } return 0; }