题意:最小生成树。
思路:最小生成树。水题不解释。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#define maxn 1<<29
using namespace std;
double sum,l[1000005],len,ans,d[1005];
int fst[1005],next[1000005],node[1000005];
int n,m,en;
bool vis[1005];
map<string,int>p;
void add(int u,int v,double len)
{
next[++en]=fst[u];
fst[u]=en;
node[en]=v;
l[en]=len;
}
void prim()
{
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)d[i]=maxn;
d[1]=0;
for(int j=0;j<n;j++)
{
int index=0;
double mi=maxn;
for(int i=1;i<=n;i++)
{
if(!vis[i]&&d[i]<mi)
{
index=i;
mi=d[i];
}
}
if(index)
{
vis[index]=1;
ans+=d[index];
for(int i=fst[index];i!=-1;i=next[i])
{
int v=node[i];
if(!vis[v]&&d[v]>l[i])
{
d[v]=l[i];
}
}
}
}
}
int main()
{
memset(fst,-1,sizeof(fst));
en=0;
string str1,str2;
scanf("%lf",&sum);
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
cin>>str1;
p[str1]=i;
}
scanf("%d",&m);
for(int i=0;i<m;i++)
{
cin>>str1>>str2>>len;
add(p[str1],p[str2],len);
add(p[str2],p[str1],len);
}
ans=0;
prim();
if(ans>sum)printf("Not enough cable\n");
else printf("Need %.1f miles of cable\n",ans);
return 0;
}