| 1 |
#include <iostream> #include <cmath> #include <iomanip> #include <set> #include <stdio.h> #include <algorithm> #include <vector> using namespace std; const int INF = 1e9 + 7; int parent[20005]; int rank1[20005]; void make_set (int v) { parent[v] = v; rank1[v] = 0; } int find_set (int v) { if (v == parent[v]) return v; return parent[v] = find_set (parent[v]); } void union_sets (int a, int b) { a = find_set (a); b = find_set (b); if (a != b) { if (rank1[a] < rank1[b]) swap(a, b); parent[b] = a; if (rank1[a] == rank1[b]) ++rank1[a]; } } int main() { int n, m, ans = 0; cin >> n >> m; set <pair <int, pair <int, int> >> s; int tmp1, tmp2, tmp3; for (int i = 0; i < m; i++) { scanf("%d%d%d", &tmp1, &tmp2, &tmp3); s.insert({tmp3, {tmp1, tmp2}}); } for (int i = 1; i <= n; i++) make_set(i); while (s.size() > 0) { int v = (s.begin() -> second).first; int v1 = (s.begin() -> second).second; int w = s.begin() -> first; s.erase(*s.begin()); if (find_set(v) != find_set(v1)) { union_sets(v, v1); ans += w; } } cout << ans; } |
Комментарии