Cod sursa(job #1499876)

Utilizator serbanSlincu Serban serban Data 11 octombrie 2015 11:40:02
Problema Arbore partial de cost minim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <bits/stdc++.h>
#define inf 2147483647

using namespace std;

struct much{
    int c;
    int x, y;
};
int t[400005];

int tata(int x) {
    if(t[x] == x)
        return x;
    return tata(t[x]);
}

void uneste(int x, int y) {
    t[tata(x)] = tata(y);
}

bool cmp(much A, much B) {
    return A.c < B.c;
}

int main()
{
    ifstream f("apm.in");
    ofstream g("apm.out");

    int n, m, X, Y, C;

    much M[400005];

    f >> n >> m;
    for(int i = 1; i <= m; i ++) {
        f >> X >> Y >> C;
        M[i].x = X;
        M[i].y = Y;
        M[i].c = C;
    }

    for(int i = 1; i <= n; i ++)
        t[i] = i;

    sort(M + 1, M + m + 1, cmp);

    int ret = 0;
    vector< pair<int, int> > muchie;

    for(int i = 1; i <= m; i ++) {
        if(tata(M[i].x) != tata(M[i].y)) {
            ret += M[i].c;
            uneste(M[i].x, M[i].y);
            muchie.push_back(make_pair(M[i].x, M[i].y));
            if(muchie.size() == (n - 1))
                i = m + 1;
        }
    }
    g << ret << "\n";
    g << n - 1 << "\n";
    for(int i = 0; i < muchie.size(); i ++) {
        g << muchie[i].first << " " << muchie[i].second << "\n";
    }
    return 0;
}