Cod sursa(job #1534843)

Utilizator dushmiMihai-Alexandru Dusmanu dushmi Data 23 noiembrie 2015 23:54:46
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <cstdio>
#include <algorithm>
#include <vector>

using namespace std;

int parent[200001], rk[200001];

int compress(int node) {
    return (parent[node] == -1 ? node : parent[node] = compress(parent[node]));
}

int main() {
    freopen("apm.in", "r", stdin);
    freopen("apm.out", "w", stdout);

    int n, m;
    scanf("%d%d", &n, &m);
    
    vector < pair < int, pair <int, int> > > edges;
    for (int i = 0; i < m; ++i) {
        int x, y, w;
        scanf("%d %d %d", &x, &y, &w);
        edges.push_back(make_pair(w, make_pair(x, y)));
    }

    sort(edges.begin(), edges.end());

    for (int i = 0; i < n; ++i) {
        parent[i] = - 1;
        rk[i] = 1;
    }

    int ans = 0;
    vector < pair <int, int> > v;
    for (int i = 0; i < edges.size(); ++i) {
        int rx = compress(edges[i].second.first);
        int ry = compress(edges[i].second.second);
        if (rx != ry) {
            if (rk[rx] > rk[ry]) {
                parent[ry] = rx;
                rk[rx] += rk[ry];
            } else {
                parent[rx] = ry;
                rk[ry] += rk[rx];
            }
            v.push_back(edges[i].second);
            ans += edges[i].first;
        }
    } 

    printf("%d\n%d\n", ans, (int)v.size());

    for (int i = 0; i < v.size(); ++i)
        printf("%d %d\n", v[i].first, v[i].second);

    return 0;
}