Cod sursa(job #1438000)

Utilizator RathebaSerbanescu Andrei Victor Ratheba Data 18 mai 2015 22:04:03
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <cstdio>
#include <algorithm>
#include <vector>

using namespace std;

const int MAX = 400003;

struct truple
{
    int a, b, w;
};

truple v[MAX];
int vtata[MAX];
vector<pair<int, int> >vsol;

bool comp(truple a, truple b)
{
    return a.w < b.w;
}
int ftata(int nod);
void uneste(int a, int b);
int n, m;

int main()
{
    freopen("apm.in", "r", stdin);
    freopen("apm.out", "w", stdout);
    int solW = 0, tata1, tata2, solM=0;
    scanf("%d%d", &n, &m);
    for(int i=1; i<=m; i++)
        scanf("%d%d%d", &v[i].a, &v[i].b, &v[i].w);

    sort(v+1, v+m+1, comp);
    for(int i=1; i<=n; i++) vtata[i] = i;
    for(int i=1; i<=m; i++)
    {
        tata1 = ftata(v[i].a);
        tata2 = ftata(v[i].b);
        if(tata1 != tata2)
        {
            solM++;
            solW += v[i].w;
            uneste(v[i].a, v[i].b);
            vsol.push_back(make_pair(v[i].a, v[i].b));
        }
    }
    printf("%d\n%d\n", solW, solM);
    vector<pair<int, int> >::iterator it;
    for(it=vsol.begin(); it!=vsol.end(); ++it)
        printf("%d %d\n", it -> first, it -> second);
    return 0;
}
void uneste(int a, int b)
{
    vtata[ftata(b)] = ftata(a);
}
int ftata(int nod)
{
    if(vtata[nod] == nod)
        return nod;

    vtata[nod] = ftata(vtata[nod]);
    return vtata[nod];
}