1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| #include <cstdio> #include <algorithm> using namespace std;
int n, m; const int N = 1e5 + 10,M = 2e5 + 10; int p[N]; struct edge { int l, r, w; bool operator < (const edge &W) { return w < W.w; } }e[M];
int find(int x) { if(x != p[x]) p[x] = find(p[x]); return p[x]; }
int main() { scanf("%d%d", &n, &m); int u, v, w; for(int i = 1; i <= m; ++i) { scanf("%d%d%d", &u, &v, &w); e[i] = {u, v, w}; } sort(e + 1, e + m + 1); for(int i = 1; i <= n; ++i) p[i] = i; int res = 0, cnt = 0, l, r; for(int i = 1; i <= m; ++i) { l = e[i].l, r = e[i].r, w = e[i].w; l = find(l), r = find(r); if(l != r) res += w, p[l] = r, ++cnt; } if(cnt < n - 1) puts("impossible"); else printf("%d", res); return 0; }
|