#include<stdio.h>
#include<string.h>
#include<map>
#include<math.h>
#include<string>
#include<algorithm>
using namespace std;
#define ll long long
#define inf 0xfffff
map<string,int>mp;
int p[510],n,m,s,flag;
double lenth,ans;
struct e
{
int a,b;
double c;
}path[250000];
int cmp(e a,e b)
{
return a.c<b.c;
}
int find(int k)
{
while(p[k]>0)
{
k=p[k];
}
return k;
}
void kruskal(int a,int b,double c)
{
int f1=find(a);
int f2=find(b);
// printf("c");
if(f1!=f2)
{
ans+=c;
//printf("c=%f ans=%f",c,ans);
p[f1]=f2;
}
}
void inti()
{
for(int i=1;i<=n;i++)
p[i]=0;
}
int main()
{ int tt;
while(scanf("%lf",&lenth)!=EOF)
{ scanf("%d",&n);
int num=1;
char aa[30],bb[30];
double temp;
inti();
ans=0;
for(int i=1;i<=n;i++)
{scanf("%s",&aa);
if(mp[aa]==0) mp[aa]=num++;}
//printf("dd");
scanf("%d",&m);
for(int i=1;i<=m;i++)
{ scanf("%s%s%lf",&aa,&bb,&temp);
path[i].a=mp[aa];
path[i].b=mp[bb];
path[i].c=temp;
}
sort(path+1,1+path+m,cmp);
// for(int i=1;i<=m;i++)
// printf("%d %d %f\n",path[i].a,path[i].b,path[i].c);
for(int i=1;i<=m;i++)
kruskal(path[i].a,path[i].b,path[i].c);
if(ans<=lenth)
printf("Need %.1f miles of cable\n",ans);
else printf("Not enough cable\n");
}
}
首先用map对每个名字编号,然后遇到名字就写入结构体,生成树。1A