#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 100 + 5;
const int INF = 1000000000;
int d[maxn][maxn]; //两点间的最大噪声值的最小值:最大噪声值指的是可达路径上的最大噪声值,最小值是指多条可达路径最大噪声值的最小值
int main() {
int n, m, Q, u, v, w, kase = 0;
while(scanf("%d%d%d", &n, &m, &Q) == 3 && n) {
// 初始化
for(int i = 0; i < n; i++) {
d[i][i] = 0; //到自身的噪声值为0
for(int j = i+1; j < n; j++) { d[i][j] = d[j][i] = INF; } //到其他点的噪声值初始化为无穷大
}
for(int i = 0; i < m; i++) {
scanf("%d%d%d", &u, &v, &w); u--; v--;
d[u][v] = min(d[u][v], w); //根据已知的边得出的u到v的最小值(不一定是最终的值)
d[v][u] = d[u][v];
}
// 主算法。需要注意的是:floyd算法只关心从i到j(有向)是否相通以及两点间的(有向)值,并不关心怎样从i到j,也不关心i和j是否相邻
for(int k = 0; k < n; k++) //枚举每个点来求i到j最大值,并用这个最大值来更新最小值
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
if(d[i][k] < INF && d[k][j] < INF)
d[i][j] = min(d[i][j], max(d[i][k], d[k][j]));//先求出i到中间某点k和k到j之间的最大值,看该最大值是否能更新i到j的最小值
// 询问
if(kase) printf("\n");
printf("Case #%d\n", ++kase);
while(Q--) {
scanf("%d%d", &u, &v); u--; v--;
if(d[u][v] == INF) printf("no path\n"); else printf("%d\n", d[u][v]);
}
}
return 0;
}
uva10048
最新推荐文章于 2023-08-19 21:49:36 发布