可以用很类似于floyd的方法来做
枚举中间点,然后ga[i][k],ga[k][j]求max后再与ga[i][j]求min
#include <cstdio>
#include <iostream>
#include <cstring>
#include <string>
#include <cmath>
#include <algorithm>
#include <cstdlib>
#include <utility>
#include <map>
#include <stack>
#include <set>
#include <vector>
#include <queue>
#include <deque>
#include <sstream>
#define x first
#define y second
#define mp make_pair
#define pb push_back
#define LL long long
#define Pair pair<int,int>
#define LOWBIT(x) x & (-x)
using namespace std;
const int MOD=1e9+7;
const int INF=0x7ffffff;
const int magic=348;
int n,e,q;
int ga[148][148];
int main ()
{
int i,j,k,s,t,d,ca=0;
while (scanf("%d%d%d",&n,&e,&q) && (n || e || q))
{
if (ca) printf("\n");
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
if (i==j) ga[i][j]=0; else ga[i][j]=INF;
for (i=1;i<=e;i++)
{
scanf("%d%d%d",&s,&t,&d);
ga[s][t]=min(ga[s][t],d);
ga[t][s]=min(ga[t][s],d);
}
for (k=1;k<=n;k++)
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
if (i!=j && i!=k && j!=k)
ga[i][j]=min(ga[i][j],max(ga[i][k],ga[k][j]));
printf("Case #%d\n",++ca);
for (i=1;i<=q;i++)
{
scanf("%d%d",&s,&t);
if (ga[s][t]>=INF) printf("no path\n"); else printf("%d\n",ga[s][t]);
}
}
return 0;
}