1. 程式人生 > 實用技巧 >Floyd演算法求多源最短路

Floyd演算法求多源最短路

  分析: 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; }