Cod sursa(job #1601717)

Utilizator Vali_DeaconuVali Deaconu Vali_Deaconu Data 16 februarie 2016 10:44:36
Problema Arbore partial de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include<cstdio>
#include<algorithm>
#include<vector>

using namespace std;

const int MAXN = 200010;
const int MAXM = 400010;

struct muchie {
    int x, y, c;
};
muchie U[MAXM];
int n, m, x, y, c, r[MAXN], t[MAXN], cost;

vector< pair<int, int> > sol;

inline bool comp(muchie a, muchie b) {
    return (a.c < b.c);
}

void read() {
    if (scanf("%d%d",&n,&m)) ;

    for (int i=1; i<=m; ++i)
        if (scanf("%d%d%d",&U[i].x,&U[i].y,&U[i].c)) ;

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

    sort(U+1, U+m+1, comp);
}

void connect(int x, int y) {
    if (r[x] > r[y])
        t[y] = x;
    else t[x] = y;

    if (r[x] = r[y])
        ++r[y];
}

int radacina(int x) {
    int r;
    for (r = x; r != t[r]; r = t[r])
        ;
    return r;
}

void algKruskal() {
    for (int i=1; i<=m; ++i) {
        int x = U[i].x;
        int y = U[i].y;
        int rx = radacina(x);
        int ry = radacina(y);
        if (rx != ry) {
            connect(rx, ry);
            sol.push_back(make_pair(U[i].x, U[i].y));
            cost += U[i].c;
        }
    }
}

void write() {
    printf("%d\n", cost);
    for(vector< pair<int, int> >::iterator i = sol.begin(); i != sol.end(); ++i)
        printf("%d %d\n", i->first, i->second);
}

int main() {
    if (freopen("apm.in", "rt", stdin)) ;
    if (freopen("apm.out", "wt", stdout)) ;

    read();
    algKruskal();
    write();

    fclose(stdin);
    fclose(stdout);
    return 0;
}