题目链接:Kruskal算法求最小生成树
#include <iostream>
#include <algorithm>using namespace std;const int N = 200010;// 与并查集中的p含义相同
int p[N];struct Edge
{int a, b, w;bool operator< (const Edge & W)const{return w < W.w;}
}edges[N];int n, m;int find(int a)
{if(p[a] != a) p[a] = find(p[a]);return p[a];
}int main()
{cin >> n >> m;for(int i = 0; i < m; i ++){int a, b, c;cin >> a >> b >> c;edges[i] = {a, b, c};}sort(edges, edges + m);// 初始化for(int i = 1; i <= n; i ++) p[i] = i;int res = 0, cnt = 0;for(int i = 0; i < m; i++){int a = edges[i].a, b = edges[i].b, w = edges[i].w;a = find(a), b = find(b);if(a != b){p[a] = b;res += w;cnt ++;}}if(cnt < n - 1) cout << "impossible" << endl;else cout << res << endl;return 0;
}