原理
算法实现
主要函数:
- 查并集: 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();}