最小生成树水题
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int f[500];
int find(int a)
{
if(a!=f[a])
f[a]=find(f[a]);
return f[a];
}
struct op
{
int x,y;
double w;
}p[500];
int cmp(const void *a,const void *b)
{
struct op *c,*d;
c=(struct op *)a;
d=(struct op *)b;
return c->w>d->w?1:-1;
}
int main()
{
int i,j,k,n,m,a,b,num;
char str[500][30],ch1[30],ch2[30];
double L,w,sum;
scanf("%lf",&L);
scanf("%d",&n);
for(i=0;i<n;i++)
f[i]=i;
for(i=0;i<n;i++)
scanf("%s",str[i]);
scanf("%d",&m);
num=0;
for(i=0;i<m;i++)
{
scanf("%s%s%lf",ch1,ch2,&w);
for(j=0;j<n;j++)
{
if(strcmp(ch1,str[j])==0)
a=j;
if(strcmp(ch2,str[j])==0)
b=j;
}
p[num].x=a;
p[num].y=b;
p[num++].w=w;
}
qsort(p,num,sizeof(p[0]),cmp);
k=0;
sum=0;
for(i=0;i<num&&k<n-1;i++)
{
a=find(p[i].x);
b=find(p[i].y);
if(a==b)continue;
f[a]=find(b);
k++;
sum+=p[i].w;
}
if(k==n-1&&sum<=L)
printf("Need %.1f miles of cable\n",sum);
else printf("Not enough cable\n");
return 0;
}