Cod sursa(job #1240926)

Utilizator sorin2kSorin Nutu sorin2k Data 12 octombrie 2014 12:37:48
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include<iostream>
#include<vector>
#include<utility>
#include<algorithm>
using namespace std;
 
vector< pair< int, pair<int, int> > > edges;
vector< pair<int, int> > answer;
int p[200001];
int n, m, cost;
 
int parent(int x) {
    int par, t;
    par = t = x;
    while(par != p[par]) {
        par = p[par];
    }
    while(x != p[x]) {
        t = p[x];
        p[x] = par;
        x = t;
    }
    return par;
}
 
int main() {
    freopen("apm.in", "r", stdin);
    freopen("apm.out", "w", stdout);
    int x, y, c, i, px, py;
    scanf("%d %d", &n, &m);
    for(i = 0; i < m; i++) {
        scanf("%d %d %d", &x, &y, &c);
        edges.push_back(make_pair(c, make_pair(x-1, y-1)));
    }
    for(i = 0; i < n; i++) {
        p[i] = i;
    }
    sort(edges.begin(), edges.end());
    for(i = 0; i < m; i++) {
        x = edges[i].second.first;
        y = edges[i].second.second;
        c = edges[i].first;
        px = parent(x);
        py = parent(y);
        if(px != py) {
            p[px] = py;
            cost += c;
            answer.push_back(make_pair(x, y));
        }
    }
    printf("%d\n", cost);
    printf("%d\n", answer.size());
    for(vector< pair<int, int> >::iterator it = answer.begin(); it != answer.end(); ++it) {
        printf("%d %d\n", it->first + 1, it->second + 1);
    }
    return 0;
}