Cod sursa(job #1777467)

Utilizator stefanchistefan chiper stefanchi Data 12 octombrie 2016 15:33:13
Problema Arbore partial de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.79 kb
#include <iostream>
#include <cstdio>
#include <algorithm>
#define Nmax 200050
#define Mmax 400050
using namespace std;
int n,m,a,b,cost,costm = 0,j;
int tatal[Nmax],adancime[Nmax];
pair<int,int> solutie[Nmax];

struct vector2
{
    int varf1,varf2,cost;
}vec[Mmax];

int radacina(int x)
{
    int aux = x,aux2 = x;
    while(tatal[aux] != aux)
        aux = tatal[aux];
    while(tatal[aux2] != aux2)
    {
        x = tatal[aux2];
        tatal[aux2] = aux;
        aux2 = x;
    }
    return aux;
}

void unite(int x, int y)
{
    if(adancime[x] > adancime [y])
        tatal[y] = tatal[x];
    else
        tatal[x] = tatal[y];
    if(adancime[x] == adancime [y])
    {
        adancime[y]++;
        tatal[x] = y;
    }
}

bool compare( vector2 a, vector2 b)
{
    if(a.cost < b.cost)
        return 1;
    else
        return 0;
}

void solve()
{
    for(int i = 1 ; i <= m ; i++)
    {
        if(radacina(vec[i].varf1) != radacina(vec[i].varf2))
        {
            costm += vec[i].cost;
            unite(radacina(vec[i].varf1), radacina(vec[i].varf2));
            solutie[j++] = make_pair(vec[i].varf1,vec[i].varf2);
        }
    }
}



void read()
{
    freopen("apm.in","r",stdin);
    freopen("apm.out","w",stdout);
    scanf("%d %d",&n,&m);
    for(int i = 1 ; i <= n ; i++)
    {
        tatal[i] = i;
        adancime[i] = 1;
    }
    for(int i = 1 ; i <= m ; i++)
    {
        scanf("%d %d %d",&a,&b,&cost);
        vec[i].cost=cost;
        vec[i].varf1 = a;
        vec[i].varf2 = b;
    }
    sort(vec + 1, vec + m , compare);

}


int main()
{
    read();
    solve();
    printf("%d\n",costm);
    for(int i = 0 ; i < j ; i++)
        printf("%d %d\n",solutie[i].first,solutie[i].second);
    return 0;
}