Floyd的变形,本质是动态规划,路径分成的两个部分中取最大值作为该路径的答案,在所有可行路径之中选一个最小值。
#include<bits/stdc++.h> using namespace std; const int maxn = 101; int d[maxn][maxn]; const int INF = 0x3f3f3f3f; int main() { int n,m,Q; int kas = 0; while(scanf("%d%d%d",&n,&m,&Q),n){ if(kas) putchar(' '); for(int i = 0; i < n; i++){ for(int j = 0; j < n; j++){ d[i][j] = i==j?0:INF; } } while(m--){ int u,v,c;scanf("%d%d%d",&u,&v,&c); u--;v--; d[u][v] = min(d[u][v],c); d[v][u] = d[u][v]; } for(int k = 0; k < n; k++){ for(int i = 0; i < n; i++){ if(d[i][k] == INF) continue; for(int j = 0; j < n; j++){ d[i][j] = min(d[i][j],max(d[i][k],d[k][j])); } } } printf("Case #%d ",++kas); while(Q--){ int u,v; scanf("%d%d",&u,&v); if(d[--u][--v] == INF) puts("no path"); else printf("%d ",d[u][v]); } } return 0; }