题意:从城市a-b将k位乘客运输至少需要几次,可以用最短路,数据较小,不会超时,也可以用并查集;
注意:每次运输都需要一名导游
最短路:
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
int e[105][105],n,m;
void floyd()
{
int i,j,k;
for(k=1;k<=n;k++)
{
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
e[i][j]=max(e[i][j],min(e[i][k],e[k][j]));
}
}
}
}
int main()
{
int a,b,c,s,e1,z,num=1,ans;
while(~scanf("%d%d",&n,&m))
{
if(n==0&&m==0)
break;
memset(e,0,sizeof(e));
while(m--)
{
scanf("%d%d%d",&a,&b,&c);
e[a][b]=c;
e[b][a]=c;
}
floyd();
scanf("%d%d%d",&s,&e1,&z);
printf("Scenario #%d\n",num++);
ans=z/(e[s][e1]-1);
if(z%(e[s][e1]-1))
ans++;
printf("Minimum Number of Trips = %d\n\n",ans);
}
return 0;
//
}
并查集
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct s
{
int u,v,w;
}s1[100000];
int n,m;
int f[100000];
int sum=0,count=0;
bool cmp(s x, s y)
{
return x.w>y.w;
}
//
int getf(int v)
{
if(f[v]==v)
return v;
else
{
f[v]=getf(f[v]);
return f[v];
}
}
int merge(int u,int v)
{
int t1,t2;
t1=getf(u);
t2=getf(v);
if(t1!=t2)
{
f[t2]=t1;
return 1;
}
return 0;
}
int main()
{
int q=1;
while(~scanf("%d%d",&n,&m))
{
if(n==0&&m==0)
break;
int i,p,pp;
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&s1[i].u,&s1[i].v,&s1[i].w);
}
int l;
scanf("%d%d%d",&p,&pp,&l);
sort(s1+1,s1+1+m,cmp);
int sum=0,count=0;
for(i=1;i<=n;i++)
f[i]=i;
for(i=1;i<=m;i++)
{
merge(s1[i].u,s1[i].v);
if(getf(p)==getf(pp))
{
sum=sum+s1[i].w;
break;
}
}
printf("Scenario #%d\n",q++);
if(l%(sum-1)==0)//每次都需要一个导游
printf("Minimum Number of Trips = %d\n\n",l/(sum-1));
else
printf("Minimum Number of Trips = %d\n\n",l/(sum-1)+1);
}
}