Cod sursa(job #1038210)

Utilizator paunmatei7FMI Paun Matei paunmatei7 Data 21 noiembrie 2013 10:38:17
Problema Arbore partial de cost minim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include<stdio.h>
#include<algorithm>

#define NMAX 200007

using namespace std;

struct apm{
    int x;
    int y;
    int c;
    inline bool operator < (const apm & dr) const {
        return c < dr.c;
    }
};

apm a[2 * NMAX];
int t[NMAX], h[NMAX], n, m, Sum;
int sol[NMAX];

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

void unite(int x, int y){
    if(h[x] == h[y]){
        ++ h[x];
        t[y] = t[x];
    }
    else
        if(h[x] < h[y])
            t[y] = t[x];
        else
            t[x] = t[y];
}

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", &a[i].x, &a[i].y, &a[i].c);
    sort(a + 1, a + m + 1);
    for(int i = 1; i <= n; ++ i){
        h[i] = 1;
        t[i] = i;
    }
    for(int i = 1; i <= m; ++ i){
        int tx = father(a[i].x);
        int ty = father(a[i].y);
        if(tx != ty){
            unite(tx, ty);
            sol[++ sol[0]] = i;
            Sum += a[i].c;
        }
    }
    printf("%d\n", Sum);
    printf("%d\n", sol[0]);
    for(int i = 1; i <= sol[0]; ++ i)
        printf("%d %d\n", a[sol[i]].x, a[sol[i]].y);
    return 0;
}