#include<bits/stdc++.h> usingnamespace std; #define ll long long structedge { int u; int v; ll w; } e[5050]; boolcmp(edge a, edge b) { return a.w < b.w; } // 并查集 vector<int> pre(2020); vector<int> Rank(2020); voidUnionFind(int n) { for (int i = 0; i <= n; i++) { pre[i] = i; Rank[i] = 0; } } intFind(int x) { while (x != pre[x]) x = pre[x]; return x; } voidjoin(int x, int y) { int root_x = Find(x); int root_y = Find(y); if (Rank[root_x] == Rank[root_y]) { Rank[root_x]++; pre[root_y] = root_x; } elseif (Rank[root_x] > Rank[root_y]) pre[root_y] = root_x; else pre[root_x] = root_y; }
ll Kruskal(int n, int m) { sort(e, e + m, cmp); // 权值从小到大 UnionFind(n); int num = 0; ll ans = 0; for (int i = 0; i < m; i++) { int u = e[i].u; int v = e[i].v; int w = e[i].w; if (Find(u) != Find(v)) { num++; ans += w; join(u, v); if (num == n - 1) break; } } return ans; } intmain() { int n, m; cin >> n >> m; for (int i = 0; i < m; i++) { cin >> e[i].u >> e[i].v >> e[i].w; } cout << Kruskal(n, m) << endl;