Cod sursa(job #1483671)

Utilizator Burbon13Burbon13 Burbon13 Data 9 septembrie 2015 18:50:20
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;

const int nmx = 200005;

int n,m,tata[nmx],rang[nmx],nod1,nod2,cost,suma;
vector <pair<int,pair<int,int> > > v;
vector <pair<int,int> > g;

inline int multime(int nod){
    while(nod != tata[nod])
        nod = tata[nod];
    return nod;
}

void uneste(const int nod1, const int nod2){
    if(rang[nod1] > rang[nod2])
        tata[nod2] = tata[nod1];
    else
    tata[nod1] = tata[nod2];
    if(rang[nod1] == rang[nod2])
        ++rang[nod2];
}

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", &nod1, &nod2, &cost);
        v.push_back(make_pair(cost,make_pair(nod1,nod2)));
    }
    sort(v.begin(),v.end());
    for(int i = 1; i <= n; ++i)
        tata[i] = i;

    for(int i = 0; i < m; ++i){
        cost = v[i].first;
        nod1 = v[i].second.first;
        nod2 = v[i].second.second;
        int tata1 = multime(nod1);
        int tata2 = multime(nod2);
        if(tata1 != tata2){
            uneste(tata1,tata2);
            g.push_back(make_pair(nod1,nod2));
            suma += cost;
        }
    }
    printf("%d\n%d\n", suma, g.size());
    for(vector<pair<int,int> >::iterator it = g.begin(); it != g.end(); ++it)
        printf("%d %d\n", it->first, it->second);
    return 0;
}