先将每个点看做一棵生成树
合并时生成树个数-1
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
struct node
{
int point1;
int point2;
int weight;
};
node line[500000];
int f[10010];
int find(int x)
{
if(f[x]==x)
return x;
return f[x]=find(f[x]);
}
bool compare(const node &a,const node &b)
{
return a.weight<b.weight;
}
int main()
{
int n,m,k;
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=n;i++)
f[i]=i;
//int a,b,c;
for(int i=1;i<=m;i++)
scanf("%d%d%d",&line[i].point1,&line[i].point2,&line[i].weight);
sort(line+1,line+1+m,compare);
int sum=n;
int i=1;
int ans=0;
while(sum>k&&i<=m)
{
int f1=find(line[i].point1),f2=find(line[i].point2);
if(f1!=f2)
{
f[f1]=f2;
ans+=line[i].weight;
sum-=1;
}
i+=1;
}
if(sum==k)
printf("%d",ans);
else
printf("No Answer");
return 0;
}
/*
5 8 0
1 2 2
1 3 1
1 5 4
3 2 2
3 4 3
3 5 4
2 5 4
4 5 5
*/