分析: 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 ",t); } return 0; }