Cod sursa(job #1198058)

Utilizator catalinrebegeaUNIBUC-Claudia Catarig catalinrebegea Data 14 iunie 2014 13:36:52
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <cstdio>
#include <algorithm>
#define Mmax 400005
#define Nmax 200005

using namespace std;

struct Edge
{
    int a,b,cost;
    bool operator <(const Edge A) const
    {
        return cost<A.cost;
    }
};
Edge v[Mmax],sol[Mmax];
int lensol,cost,t[Nmax];

inline void Union(int a, int b)
{
    t[a]+=t[b];
    t[b]=a;
}

inline int Tata(int a)
{
    int rad,i=a;
    while(t[a]>0)
        a=t[a];
    rad=a;
    while(t[i]>0)
    {
        a=t[i];
        t[i]=rad;
        i=a;
    }
    return rad;
}

int main()
{
    int a,b,i,N,M;
    freopen ("apm.in","r",stdin);
    freopen ("apm.out","w",stdout);
    scanf("%d%d", &N,&M);
    for(i=1;i<=N;++i)
        t[i]=-1;
    for(i=1;i<=M;++i)
        scanf("%d%d%d", &v[i].a,&v[i].b,&v[i].cost);
    sort(v+1,v+M+1);
    for(i=1;i<=M;++i)
    {
        a=Tata(v[i].a); b=Tata(v[i].b);
        if(a!=b)
        {
            sol[++lensol]=v[i];
            cost+=v[i].cost;
            Union(a,b);
        }
    }
    printf("%d\n%d\n", cost,lensol);
    for(i=1;i<=lensol;++i)
        printf("%d %d\n", sol[i].a,sol[i].b);
    return 0;
}