思路:1:本题要求求最大值(好比‘最大‘生成树),我们只需要将从小排序改为从大排序即可
2:因为一个毛毯只能由两个区域构成,而且这两个区域之间不能再连接其他区域,
所有我们只需从大开始连接k条边即可
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e5+10,M=N;
struct edge{
int u,v,w;
}e[M];
int fa[N],n,m,k;
bool cmp(edge a,edge b)
{
return a.w>b.w;
}
int find(int x)
{
if(fa[x]==x)return x;
else
{
fa[x]=find(fa[x]);
return fa[x];
}
}
int main()
{
cin>>n>>m>>k;
for(int i=1;i<=m;i++)
{
cin>>e[i].u>>e[i].v>>e[i].w;
}
for(int i=1;i<=n;i++)
{
fa[i]=i;
}
sort(e+1,e+1+m,cmp);
int cnt=0,sum=0;
for(int i=1;i<=m;i++)
{
int f1=find(e[i].u);
int f2=find(e[i].v);
if(f1!=f2)
{
fa[f1]=f2;
cnt++;
sum+=e[i].w;
}
if(cnt>=k)break;//不是cnt==n-1(因为一个毛毯只能由两个区域构成,这两个区域之间不能再连接其他区域)
}
cout<<sum;
return 0;
}