Cod sursa(job #1918824)

Utilizator paunmatei7FMI Paun Matei paunmatei7 Data 9 martie 2017 16:59:53
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <cstdio>
#include <algorithm>

using namespace std;

int h[200007], T[200007] , c[200007], m , n , xi , yi , nr , num ;

struct apm {
    int x, y, cost;
};

apm a[400007];

bool cmp(apm b, apm c) {
    return b . cost < c . cost;
}

int father(int i) {
    if(i == T[i]) {
        return i;
    }
    return father(T[i]);
}

int unite(int i, int j) {
    i = father(i);
    j = father(j);
    if(i == j) {
        return 0;
    }
    if(h[i] == h[j]) {
        ++h[i];
        T[i] = i;
    }
    if(h[i] < h[j]) {
        T[i] = j;
    }
    else {
        T[j] = i;
    }
    return 1 ;
}

int main() {
    freopen("apm.in", "r", stdin);
    freopen("apm.out", "w", stdout);
    scanf("%d %d", &n, &m);
    for(int i = 1 ; i <= m ; ++i) {
        scanf("%d %d %d\n", &a[i].x , &a[i].y, &a[i].cost);
    }
    for(int i = 1; i <= n; ++i) {
        T[i] = i;
    }
    sort(a + 1, a + m + 1, cmp );
    for(int i = 1 ; i <= m ; ++i) {
        xi = father(a[i]. x);
        yi = father(a[i].y);
        if(xi != yi && num <= n - 1) {
            int k;
            ++ num;
            nr += a[i].cost;
            k = unite(a[i].x, a[i].y);
            c[num] = i;
        }
    }
    printf("%d\n", nr);
    printf("%d\n", num);
    for(int i = 1; i <= num; ++i) {
        printf("%d %d\n", a[c[i]].x, a[c[i]]. y);
    }
    return 0 ;
}