Cod sursa(job #1777415)

Utilizator gabor.vlad13lil pump gabor.vlad13 Data 12 octombrie 2016 14:08:07
Problema Arbore partial de cost minim Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

#define NMAX 200001
#define MMAX 400001

using namespace std;

int X, Y, C, N, M, l=1;
int costMinim;
int tata[MMAX];
int sol[MMAX];

struct pereche
{
    int v1;
    int v2;
    int cost;
    pereche(int a=0, int b=0, int c=0)
    {
        v1 = a;
        v2 = b;
        cost = c;
    }

}vec[MMAX];

int radacina(int x)
{
    while (tata[x] != x)
        x = tata[x];
    return x;
}

bool comparator(pereche a, pereche b)
{
    return a.cost < b.cost;
}

void unire(int x, int y)
{
    tata[radacina(y)] = radacina(x);
}

void solve()
{
    for (int i=1; i<=M; i++)
    {
        if (radacina(vec[i].v1) != radacina(vec[i].v2))
        {
            costMinim+=vec[i].cost;
            unire(vec[i].v1, vec[i].v2);
            sol[l++] = i;
        }
    }
}
void read()
{
    scanf("%d %d\n", &N, &M);
    for (int i=1; i<=M; i++)
    {
        scanf("%d %d %d\n", &vec[i].v1, &vec[i].v2, &vec[i].cost);
    }

    for (int i=1; i<=N; i++)
        tata[i] = i;
}
int main()
{
    freopen("apm.in", "r", stdin);
    freopen("apm.out", "w", stdout);
    read();
    sort(vec+1, vec+M+1, comparator);
    solve();
    printf("%d\n%d\n", costMinim, l-1);
    for (int i=1; i<l; i++)
        printf("%d %d\n", vec[i].v1, vec[i].v2);
    return 0;
}