问题
分析
直接用floyd算法,简单调整一下
g[i][j]=min(g[i][j],max(g[i][k],g[k][j]))
注意: 节点是从1开始编号的,不是0
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <vector>
#include <utility>
#include <map>
#include <string>
using namespace std;
const int maxn=105;
int g[maxn][maxn],c,s,q,c1,c2,w,kase=0;
int main(void){
while(scanf("%d%d%d",&c,&s,&q)==3 && (c||s||q)){
memset(g,0x3f3f3f3f,sizeof(g));
for(int i=0;i<s;++i){
scanf("%d%d%d",&c1,&c2,&w);
g[c1][c2]=g[c2][c1]=w;
}
for(int k=1;k<=c;++k){
for(int i=1;i<=c;++i){
for(int j=1;j<=c;++j){
g[i][j]=min(g[i][j],max(g[i][k],g[k][j]));
}
}
}
if(kase) printf("\n");
printf("Case #%d\n",++kase);
for(int i=0;i<q;++i){
scanf("%d%d",&c1,&c2);
int t=g[c1][c2];
// cout<<t<<endl;
if(t<0x3f3f3f3f) printf("%d\n",g[c1][c2]);
else printf("no path\n");
}
}
return 0;
}