原理
算法实现
主要函数:
- 查并集: find 点 x 的祖先
- edge的比较大小函数
- kruskal函数
#include<iostream>
#include<algorithm>
using namespace std;
struct Edge{
int a,b,w;
}edg[200010];
int p[200010];
int n,m;
bool compareEdg(const Edge &a, const Edge &b ){
return a.w< b.w;
}
int findx(int x){
if(p[x]!=x ){
p[x] = findx(p[x]);
}
return p[x];
}
void kruskal(){
int res=0;
int cnt =0;
for(int i=1; i<=m; i++){
int pa = findx(edg[i].a);
int pb = findx(edg[i].b);
if(pa!=pb){
p[pa] = pb;
res += edg[i].w;
cnt++;
//cout<<"边长"<<edg[i].w<<"左边点"<<edg[i].a<<"右边点"<<edg[i].b<<endl;
}
else{
continue;
}
}
if(cnt < n-1){
cout<<"impossible";
}
else{
cout<<res;
}
}
int main(){
cin>>n>>m;
for(int i=1; i<=n; i++){
p[i] = i;
}
for(int i=1; i<=m; i++){
cin>>edg[i].a>>edg[i].b>>edg[i].w;
}
sort(edg+1, edg+m+1, compareEdg);
kruskal();
}