#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<climits>
#include<queue>
#include<vector>
#include<set>
#include<map>
#include<cstring>
#include<string>
using namespace std;
int C,S,Q;
const int INF=100000000;
const int maxc=100+10;
const int maxs=1000+10;
const int maxq=10000+10;
int p[maxc];
struct edge
{
int u,v,cost;
edge(int u=0,int v=0,int cost=0):u(u),v(v),cost(cost){}
};
edge es[maxs];
bool cmp(const edge& e1,const edge& e2)
{
return e1.cost<e2.cost;
}
int find(int x)
{
return p[x]==x ? x:p[x]=find(p[x]);
}
int kruskal(int s,int t)
{
sort(es,es+S,cmp);
for(int i=0;i<C;i++)
p[i]=i;
int res=0;
for(int i=0;i<S;i++)
{
edge e=es[i];
int x=find(e.u);
int y=find(e.v);
if(x!=y)
{
res=max(res,e.cost);
p[x]=y;
if(find(s)==find(t))return res;
}
}
return INF;
}
int main()
{
int num=1;
while(~scanf("%d%d%d",&C,&S,&Q))
{
if(S==0&&C==0&&Q==0)break;
for(int i=0;i<S;i++)
{
int c1,c2,d;
scanf("%d%d%d",&c1,&c2,&d);
c1--;
c2--;
es[i]=edge(c1,c2,d);
}
if(num!=1)printf("\n");
printf("Case #%d\n",num++);
for(int i=0;i<Q;i++)
{
int c1,c2;
scanf("%d%d",&c1,&c2);
c1--;
c2--;
int ans=kruskal(c1,c2);
if(ans==INF)printf("no path\n");
else printf("%d\n",ans);
}
//printf("\n");
}
return 0;
}
Floyd算法:
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<climits>
#include<queue>
#include<vector>
#include<set>
#include<map>
#include<cstring>
#include<string>
using namespace std;
int C,S,Q;
const int INF=100000000;
const int maxc=100+10;
const int maxs=1000+10;
const int maxq=10000+10;
int d[maxc][maxc];
void Floyd()
{
for(int k=0;k<C;k++)
for(int i=0;i<C;i++)
for(int j=0;j<C;j++)
{
int temp=max(d[i][k],d[k][j]);
d[i][j]=min(d[i][j],temp);
}
}
int main()
{
int num=1;
while(~scanf("%d%d%d",&C,&S,&Q))
{
if(S==0&&C==0&&Q==0)break;
for(int i=0;i<C;i++)
{
fill(d[i],d[i]+C,INF);
d[i][i]=0;
}
for(int i=0;i<S;i++)
{
int c1,c2,cost;
scanf("%d%d%d",&c1,&c2,&cost);
c1--;
c2--;
d[c1][c2]=cost;
d[c2][c1]=cost;
}
Floyd();
if(num!=1)printf("\n");
printf("Case #%d\n",num++);
for(int i=0;i<Q;i++)
{
int c1,c2;
scanf("%d%d",&c1,&c2);
c1--;
c2--;
if(d[c1][c2]==INF)printf("no path\n");
else printf("%d\n",d[c1][c2]);
}
}
return 0;
}