一开始有n个孤立的点则有n个生成树 题目询问生成k个生成树的最小代价是多少
我们仔细想一下kruskal的过程,其实每一步建边都保证了当前的所有生成树花费最小。每次合并都少1棵生成树,那么我们只需在kruskal的过程中记录当前的生成树数量num,每次合并时num–,更新花费即可,注意 一开始是每个点都是有1棵生成树,故初始生成树数量为n
# include <bits/stdc++.h>
using namespace std;
#define int long long
int n,m,k;
const int N=1e3+10,M=1e4+10;
int p[N];
struct node
{
int a,b,w;
}edge[M];
bool cmp(node a,node b)
{
return a.w<b.w;
}
int find(int x)
{
if(p[x]!=x)p[x]=find(p[x]);
return p[x];
}
signed main()
{
cin>>n>>m>>k;
for(int i=1;i<=n;i++)
p[i]=i;
for(int i=1;i<=m;i++)
{
int a,b,c;
cin>>a>>b>>c;
edge[i]={a,b,c};
}
sort(edge+1,edge+m+1,cmp);
int cnt=n,res=0;
if(n<k)
{
cout<<"No Answer";
return 0;
}
for(int i=1;i<=m;i++)
{
int a=find(edge[i].a),b=find(edge[i].b);
if(a!=b)
{
p[a]=b;
res+=edge[i].w;
cnt--;
if(cnt==k)
break;
}
}
cout<<res;
}