哎。。。策略错误。。。最小生成树竟然没写完。。。。就差一点就ac五道了T_T
#include <iostream>
#include <string>
#include <ctype.h>
#include <algorithm>
#include <string.h>
#include <cstdio>
#include <cstdlib>
using namespace std;
struct path
{
int name1;
int name2;
float pathl;
};
float l;
int n;
int m;
string name[505];
struct path p[505];
bool in[505];
int cmp(struct path a,struct path b)
{
return a.pathl<b.pathl;
}
int isin(int i)
{
if(in[p[i].name1] && !in[p[i].name2])
{
in[p[i].name2]=true;
return 0;
}
else
{
if(!in[p[i].name1] && in[p[i].name2])
{
in[p[i].name1]=true;
return 0;
}
}
if(in[p[i].name1] && in[p[i].name2])
return 1;
return -1;
}
float getlen()
{
int rh=n-2;
sort(p,p+m,cmp);
float res=p[0].pathl;
in[p[0].name1]=in[p[0].name2]=true;
int i=1;
int j=1;
while(rh>0)
{
int t=isin(j);
if(t==0)
{
rh--;
i++;
res+=p[j].pathl;
for(int k=j;k>=i;k--)
p[k]=p[k-1];
j=i;
}
else
{
if(t==1)
{
i++;
for(int k=j;k>i;k--)
p[k]=p[k-1];
j++;
}
else
j++;
}
}
return res;
}
int main()
{
cin>>l;
cin>>n;
for(int i=0;i<n;i++)
cin>>name[i];
string a,b;
float tl;
int flag;
cin>>m;
for(int i=0;i<m;i++)
{
flag=0;
cin>>a>>b;
cin>>p[i].pathl;
for(int j=0;j<n;j++)
{
if(name[j]==a)
{
p[i].name1=j;flag+=1;
}
if(name[j]==b)
{
p[i].name2=j;flag+=1;
}
if(flag==2)
break;
}
}
float minl=getlen();
if(minl>l)
cout<<"Not enough cable";
else
printf("Need %.1f miles of cable",minl);
return 0;
}