这道题是找有k条边的最大生成树,我们使用一个并查集,再定义一个结构体,将边的值排序,然后开始构建最大生成树,如果有环的话说明在一个集合中,有公共的祖先。
#include <iostream>
#include <algorithm>
using namespace std;
int fa[100001];
struct node{
int x,y;
int value;
};
node b[100001];
int find(int num){
if(fa[num]==num){
return num;
}else{
while(fa[num]!=num){
num=fa[num]=fa[fa[num]];
}
return num;
}
}
bool cmp(node a,node b){
return a.value>b.value;
}
int main() {
int n,m,k;
cin>>n>>m>>k;
for(int i=0;i<m;i++){
cin>>b[i].x>>b[i].y>>b[i].value;
}
sort(b,b+m,cmp);
int sum=0,flag=0;
for(int i=1;i<=n;i++){
fa[i]=i;
}
for(int i=0;i<k;i++){
if(find(b[flag].x)!=find(b[flag].y)){
sum+=b[flag].value;
fa[find(b[flag].x)]=fa[find(b[flag].y)];
flag++;
}else{
flag++;
i--;
}
}
cout<<sum<<endl;
return 0;
}
23333一次编译通过还有点小激动
我们可以用并查集来表示有没有环。