题意:
卡车要运货,希望尽可能的运,所以,在各个城市中找寻一条载重量最大的一条路,然后看看这条路径中,哪条路的负重值最小,输出这个最小值。
题解:
和上一题差不多,只要处理个字符串就好了,然后把所有边进行降序排列,直到把两个目的地连通。输出最后连通的那条边。
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int n,r,numb;
char name[250][50],name1[50],name2[50];
struct point
{
int in,out,leth;
}eg[20000];
int pre[250];
int change(char it[]) //城市名字处理,转换成数字;
{
for(int i=0;i<=numb;i++)
{
if(!strcmp(it,name[i]))
{
return i;
}
}
strcpy(name[numb],it);
return numb++;
}
bool cmp(point a,point b) //降序排列,这样就可以找到最大的路了
{
return a.leth>b.leth;
}
int find(int w)
{
int root=w,now;
while(root!=pre[root])
root=pre[root];
while(pre[w]!=root)
{
now=pre[w];
pre[w]=root;
w=now;
}
return root;
}
int main()
{
int cas=1;
while(scanf("%d%d",&n,&r)&&(n+r))
{
memset(name,0,sizeof(name));
numb=0;
for(int i=0;i<r;i++)
{
scanf("%s%s%d",name1,name2,&eg[i].leth);
eg[i].in=change(name1);
eg[i].out=change(name2);
//printf("%d %d\n",eg[i].in,eg[i].out);
}
scanf("%s%s",name1,name2);
int s,e,max;
s=change(name1);
e=change(name2);//printf("%d %d\n",s,e);
for(int i=0;i<n;i++)
pre[i]=i;
sort(eg,eg+r,cmp);
for(int i=0;i<=r;i++)
{
if(find(s)!=find(e))
{
max=eg[i].leth;
int x,y;
x=find(eg[i].in);
y=find(eg[i].out);
if(x!=y)
{
pre[y]=x;
}
}
else
{ printf("Scenario #%d\n%d tons\n\n",cas++,max);
break;
}
// printf("i=%d max=%d\n",i,max);
}
}
return 0;
}