#include <iostream>
#include <stdio.h>
#include <string.h>
#include <map>
using namespace std;
bool vis[10010];
bool e[1010][1010];
double g[1010][1010];
double l[10010];//{l[i]存放顶点i到当前已建成的生成树中任意一顶点j的权值g[i][j]的最小值}
int main()
{
double len;
int n,m;
int i,j,k;
scanf("%lf",&len);
string str;
map<string,int> ma;
memset(vis,1,sizeof(vis));
memset(e,false,sizeof(e));
memset(g,0,sizeof(g));
memset(l,0x7f,sizeof(l));
l[1]=0;
ma.clear();
scanf("%d",&n);
for( i = 1; i<=n; i++)
{
cin>>str;
ma[str]= i;
}
scanf("%d",&m);
for( i = 1; i<=m; i++)
{
string str1,str2;
double dis;
cin>>str1;
cin>>str2;
scanf("%lf",&dis);
g[ma[str1]][ma[str2]] = g[ma[str2]][ma[str1]] = dis;
e[ma[str1]][ma[str2]] = e[ma[str2]][ma[str1]] = true;
}
for (i=0;i<n;i++)
{
int k=0;
for (j=1;j<=n;j++) //找一个未加入到生成树中的顶点,记为k,要求k到当前生成树的代价量最小
if (vis[j] && l[j]<l[k])
k=j;
//cout<<k<<"l[k]"<<l[k]<<endl;
vis[k]=false; //顶点k加入生成树
for (j=1;j<=n;j++) //找到生成树中的顶点j,要求g[k][j]最小
if (vis[j] && e[k][j] && g[k][j]<l[j])
{
l[j]=g[k][j];
}
}
double total = 0;
for (i=1;i<=n;i++)
total += l[i];
if(total <= len)
printf("Need %.1lf miles of cable\n",total);
else
printf("Not enough cable\n");
return 0;
}
#include <stdio.h>
#include <string.h>
#include <map>
using namespace std;
bool vis[10010];
bool e[1010][1010];
double g[1010][1010];
double l[10010];//{l[i]存放顶点i到当前已建成的生成树中任意一顶点j的权值g[i][j]的最小值}
int main()
{
double len;
int n,m;
int i,j,k;
scanf("%lf",&len);
string str;
map<string,int> ma;
memset(vis,1,sizeof(vis));
memset(e,false,sizeof(e));
memset(g,0,sizeof(g));
memset(l,0x7f,sizeof(l));
l[1]=0;
ma.clear();
scanf("%d",&n);
for( i = 1; i<=n; i++)
{
cin>>str;
ma[str]= i;
}
scanf("%d",&m);
for( i = 1; i<=m; i++)
{
string str1,str2;
double dis;
cin>>str1;
cin>>str2;
scanf("%lf",&dis);
g[ma[str1]][ma[str2]] = g[ma[str2]][ma[str1]] = dis;
e[ma[str1]][ma[str2]] = e[ma[str2]][ma[str1]] = true;
}
for (i=0;i<n;i++)
{
int k=0;
for (j=1;j<=n;j++) //找一个未加入到生成树中的顶点,记为k,要求k到当前生成树的代价量最小
if (vis[j] && l[j]<l[k])
k=j;
//cout<<k<<"l[k]"<<l[k]<<endl;
vis[k]=false; //顶点k加入生成树
for (j=1;j<=n;j++) //找到生成树中的顶点j,要求g[k][j]最小
if (vis[j] && e[k][j] && g[k][j]<l[j])
{
l[j]=g[k][j];
}
}
double total = 0;
for (i=1;i<=n;i++)
total += l[i];
if(total <= len)
printf("Need %.1lf miles of cable\n",total);
else
printf("Not enough cable\n");
return 0;
}