UVA_10099

这个题目实际上要求所有路径中最小边的最大值。由于Floyd代码写起来很清晰,也比较容易解决这类问题,所以我就直接写了Floyd

    但是由于这个题目只有一组查询,所以Floyd的优势就不那么明显了,听了老大的思路之后,我便又写一个二分的程序,果然比Floyd快很多。

#include<stdio.h>
#include<string.h>
int f[110][110];
int main()
{
int i,j,k,u,v,w,n,S,T,D,N,R,t,ans;
t=0;
while(1)
{
scanf("%d%d",&N,&R);
if(!N&&!R)
break;
for(i=1;i<=N;i++)
for(j=1;j<=N;j++)
{
if(i==j)
f[i][j]=1000000000;
else
f[i][j]=-1;
}
for(i=0;i<R;i++)
{
scanf("%d%d%d",&u,&v,&w);
f[u][v]=f[v][u]=w;
}
scanf("%d%d%d",&S,&T,&D);
for(k=1;k<=N;k++)
for(i=1;i<=N;i++)
for(j=1;j<=N;j++)
if(f[i][k]>f[i][j]&&f[k][j]>f[i][j])
f[i][j]=f[i][k]<f[k][j]?f[i][k]:f[k][j];
printf("Scenario #%d\n",++t);
ans=0;
ans+=D/(f[S][T]-1);
if(D%(f[S][T]-1)!=0)
ans++;
printf("Minimum Number of Trips = %d\n",ans);
printf("\n");
}
return 0;
}

#include<stdio.h>
#include<string.h>
int u[10010],v[10010],w[10010],p[110];
int find(int x)
{
return p[x]==x?x:(p[x]=find(p[x]));
}
int init()
{
char c;
int x=0;
for(;;)
{
c=getchar();
if(c==' '||c=='\n')
return x;
x=(x<<3)+(x<<1)+c-'0';
}
}
int main()
{
int i,j,k,n,S,T,D,N,R,t,ans,min,mid,max,tx,ty;
t=0;
while(1)
{
N=init();R=init();
if(!N&&!R)
break;
min=1000000000;
max=0;
for(i=0;i<R;i++)
{
u[i]=init();
v[i]=init();
w[i]=init();
if(w[i]>max)
max=w[i];
if(w[i]<min)
min=w[i];
}
max++;
S=init();T=init();D=init();
while(1)
{
mid=(max+min)/2;
for(i=1;i<=N;i++)
p[i]=i;
for(i=0;i<R;i++)
if(w[i]>=mid)
{
tx=find(u[i]);
ty=find(v[i]);
if(tx!=ty)
p[tx]=ty;
}
if(mid==min)
break;
if(find(S)!=find(T))
max=mid;
else
min=mid;
}
printf("Scenario #%d\n",++t);
ans=0;
ans+=D/(mid-1);
if(D%(mid-1)!=0)
ans++;
printf("Minimum Number of Trips = %d\n",ans);
printf("\n");
}
return 0;
}



posted on 2011-09-30 14:15  Staginner  阅读(540)  评论(3编辑  收藏  举报