Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <algorithm>
- #include <fstream>
- using namespace std;
- const int maxn = 1e5;
- int ranks[maxn];
- int parent[maxn];
- struct edge {
- int from, to, w;
- edge(int a = 0, int b = 0, int c = 0) {
- from = a;
- to = b;
- w = c;
- }
- bool operator<(edge a) {
- return a.w > w;
- }
- };
- void make_set(int v) {
- ranks[v] = 0;
- parent[v] = v;
- }
- int find_set(int v) {
- if(parent[v] == v) return v;
- return parent[v] = find_set(parent[v]);
- }
- void onion_set(int a, int b) {
- a = find_set(a);
- b = find_set(b);
- if (a != b) {
- if (ranks[a] < ranks[b]) swap(a, b);
- parent[b] = a;
- if (ranks[a] == ranks[b]) ranks[a]++;
- }
- }
- edge e[maxn];
- int main() {
- int n,m, ans = 0;
- ifstream in("spantree2.in");
- ofstream out("spantree2.out");
- in >> m >> n;
- for(int i = 0; i < m; i++) {
- make_set(i + 1);
- }
- for(int i = 0; i < n; i++) {
- int a, b, c;
- in >> a >> b >> c;
- e[i] = edge(a, b, c);
- }
- sort(e, e + n);
- for(int i = 0; i < n; i++) {
- int v = e[i].from;
- int u = e[i].to;
- int w = e[i].w;
- if (find_set(v) != find_set(u)) {
- ans += w;
- onion_set(v, u);
- }
- }
- out << ans;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement