Cod sursa(job #913722)

Utilizator Sm3USmeu Rares Sm3U Data 13 martie 2013 18:51:46
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <cstdio>
#include <queue>
#include <algorithm>

#define nMax 400010

using namespace std;

struct muchie{
    int x;
    int y;
    int cost;
};

struct cmp{
    bool operator()(const muchie &a, const muchie &b)const{
        return a.cost < b.cost;
    }
};

muchie a[nMax];
queue <int> q;
int componenta[nMax / 2];
int m;
int n;

int tata(int i){
    if(componenta[i] == i){
        return i;
    }
    return componenta[i] = tata(componenta[i]);
}

void citire(){
    scanf("%d %d", &n, &m);
    for(int i = 0; i < m; ++ i){
        scanf("%d %d %d", &a[i].x, &a[i].y, &a[i].cost);
    }
    sort(a, a + m, cmp());
    for(int i = 1; i <= n; ++ i){
        componenta[i] = i;
    }
}

void afis(){
    printf("%d\n", n - 1);
    while(!q.empty()){
        printf("%d %d\n", a[q.front()].x, a[q.front()].y);
        q.pop();
    }
}

void apm(){
    int s = 0;
    int N = n - 1;
    for(int i = 0; i < m; ++ i){
        if(tata(a[i].x) != tata(a[i].y)){
            componenta[tata(a[i].y)] = tata(a[i].x);
            s += a[i].cost;
            q.push(i);
            N --;
            if(!N){
                printf("%d\n", s);
                afis();
                return;
            }
        }
    }
}

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

    citire();
    apm();


    return 0;
}