【题目分析】
最小生成树。
【代码】
#include <cstdio>
#include <cmath>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <map>
#include <string>
using namespace std;
map <string,int> mp;
string s;
int f[501],en=0,n,m;
int fr[2500001],to[2500001],rank[2500001];
double w[2500001],len,ans=0;
inline bool cmp(int a,int b)
{return w[a]<w[b];}
inline int gf(int k)
{if (f[k]==k) return k; else return f[k]=gf(f[k]);}
int main()
{
scanf("%lf",&len);
scanf("%d",&n);
for (int i=1;i<=n;++i)
{
cin>>s;
if (!mp[s]) mp[s]=++en;
}
scanf("%d",&m);
for (int i=1;i<=m;++i)
{
cin>>s;fr[i]=mp[s];
cin>>s;to[i]=mp[s];
scanf("%lf",&w[i]);
}
for (int i=1;i<=n;++i) f[i]=i;
for (int i=1;i<=m;++i) rank[i]=i;
sort(rank+1,rank+m+1,cmp);
for (int i=1;i<=m;++i)
{
int l=fr[rank[i]],r=to[rank[i]];
int fl=gf(l),fr=gf(r);
if (fl!=fr)
{
ans+=w[rank[i]];
f[fl]=fr;
}
}
if (ans<=len)
printf("Need %.1f miles of cable\n",ans);
else printf("Not enough cable\n");
}