基础算法学习---kruskal
使用
稀疏图求最小生成树边权和
O(mlogm)
模板
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 200010;
int n,m;
int p[N];
//并查集
int find(int x){
if(p[x] != x) p[x] = find(p[x]);
return p[x];
}
//结构体存边
struct Edge{
int a,b,w;
bool operator < (const Edge &x) const{
return w < x.w;
}
} es[N];
//遍历边,若不连通,加入集合,res += 权
int kruskal(){
int cnt = 0,res = 0;
for(int i = 1;i <= n;i ++) p[i] = i;
sort(es,es + m);
for(int i = 0;i < m;i ++){
int a = es[i].a,b = es[i].b,w = es[i].w;
a = find(a),b = find(b);
if(a != b){
p[a] = b;
res += w;
cnt ++;
}
}
//不构成树
if(cnt < n - 1) return 0x3f3f3f3f;
else return res;
}
int main(){
cin >> n >> m;
for(int i = 0;i < m;i ++){
int a,b,c;
cin >> a >> b >> c;
es[i] = {a,b,c};
}
int t = kruskal();
if(t == 0x3f3f3f3f) cout << "impossible";
else cout << t;
}