将k个棉花糖看做k个点,然后求最小生成树,只取n-k个点出来即可。在取的过程中注意形成环的状况,可以用并查集进行避免。
代码:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define MAX 1001
using namespace std;
struct node
{
int pnt;
int nxt;
int cost;
}a[MAX*11];
int n,m,k,p[MAX*10];
bool vis[MAX];
bool cmp(node a,node b)
{
return a.cost<b.cost;
}
int find(int x)
{
if(p[x]==x)
return x;
return p[x]=find(p[x]);
}
int main()
{
while(scanf("%d%d%d",&n,&m,&k)!=EOF)
{
int e=0;
for(int i=0;i<m;i++)
scanf("%d%d%d",&a[i].pnt,&a[i].nxt,&a[i].cost);
for(int i=0;i<=n;i++)
p[i]=i;
sort(a,a+m,cmp);
int ans=0,cou=0;
for(int i=0;i<m;i++)
{
int ita=find(a[i].pnt);
int itb=find(a[i].nxt);
if(ita!=itb)
{
ans+=a[i].cost;
p[ita]=itb;
cou++;
if(cou==n-k)
break;
}
}
if(cou==n-k)
printf("%d\n",ans);
else
printf("No Answer\n");
}
return 0;
}