Cod sursa(job #407322)

Utilizator RobytzzaIonescu Robert Marius Robytzza Data 2 martie 2010 11:20:11
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <stdio.h>
#include <algorithm>
#define size 400010

using namespace std;

struct muchie
{
    int x,y,cost;
}a[size];

int n,m,Tati[size];
int sol[size];
int Cost,nr;

struct cmp
{
    bool operator()(const muchie &a,const muchie &b) const
    {
        return a.cost<b.cost;
    }
};


void citire()
{
    scanf ("%d %d",&n,&m);

    for (int i = 0 ; i < m ; i++)
        scanf ("%d %d %d\n" , &a[i].x , &a[i].y , &a[i].cost);

    sort(a , a + m ,cmp());

    for (int i = 1 ; i <= n ; i++)
        Tati[i] = i;
}

int T(int i)
{
    if (Tati[i] == i)
        return i;
    return Tati[i]=T(Tati[i]);
}


void solve()
{
    for (int i = 0 ; i < m ; i++)
    {
        if (T(a[i].x) != T(a[i].y))
        {
            Cost += a[i].cost;
            Tati[T(a[i].x)] = T(a[i].y);
            sol[nr++] = i;
        }
    }
}

void afisare()
{
    printf("%d\n%d\n",Cost,nr);
    for (int i = 0 ; i < nr ; i++)
        printf("%d %d\n",a[sol[i]].x , a[sol[i]].y);
}

int main()
{
    freopen ("apm.in","r",stdin);
    freopen ("apm.out","w",stdout);
    citire();
    solve();
    afisare();
    return 0;
}