思路:
1.将所有边按权重从小到大排序;
2.枚举每条边a——b, 权重为c,if a , b不连通将这条边加入集合中。(运用之前学的并查集)
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
const int N = 200010;
struct NODE
{
int a, b, c;
bool operator< (const NODE & C)const
{
return c < C.c;
}
}node[N];
int n, m;
int p[N];
int find(int x)
{
if(p[x] != x) p[x] = find(p[x]);
return p[x];
}
int kruskal()
{
sort(node, node + m);
for(int i = 1; i <= n; i ++) p[i] = i;
int cnt = 0, ans = 0;
for(int i = 0; i < m ; i ++)
{
int a = node[i].a, b = node[i].b, c = node[i].c;
a = find(a), b = find(b);
if(a != b)
{
cnt ++;
ans += c;
p[a] = b;
}
}
if(cnt < n - 1) return 0x3f3f3f3f;
return ans;
}
int main()
{
scanf("%d%d", &n, &m);
for(int i = 0; i < m; i ++)
{
int a, b ,c;
scanf("%d%d%d", &a, &b, &c);
node[i] = {a, b, c};
}
int t = kruskal();
if(t == 0x3f3f3f3f) printf("%s\n", "impossible");
else printf("%d\n", t);
return 0;
}来自acwing