题意分析
要保留不超过k条地毯,使得所有地点之间是连通的,且不构成环,并且保留的地毯边之和要最大。
解题思路
使得所有点之间是连通的,不构成环,这是一个生成树的结构,但由于要求保留的边是边权尽可能大的,因此,可认为这是一个“最大生成树”。
注意问题
比较简单,kruskal板子题。
代码实现
#include<bits/stdc++.h>
using namespace std;
int n,m,k,fa[100009],ans;
struct Node{
int from,to,w;
}a[100009];
bool cmp(Node x,Node y)
{
return x.w>y.w;
}
int find(int x)
{
if(x==fa[x]) return x;
return fa[x]=find(fa[x]);
}
int main()
{
cin>>n>>m>>k;
for(int i=1;i<=n;i++) fa[i]=i;
for(int i=1;i<=m;i++)
{
cin>>a[i].from>>a[i].to>>a[i].w;
}
sort(a+1,a+m+1,cmp);
for(int i=1;i<=m;i++)
{
int x=find(a[i].from);
int y=find(a[i].to);
if(x==y) continue;
else
{
//把他俩合并在一起
fa[x]=y;
ans+=a[i].w;
k--;
}
if(k==0) break;
}
cout<<ans;
return 0;
}