Cod sursa(job #1251315)

Utilizator laszloasandorLaszlo Sandor laszloasandor Data 29 octombrie 2014 11:41:27
Problema Arbore partial de cost minim Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.12 kb
#include <stdio.h>
#define fr(i,a,b) for(i=a;i<b;++i)

typedef struct
{
    int fp,ep,s;
}el;
int n,m,i,ss=0,j;
int*par;
int*P;

int cmp(const void*a,const void*b) {return (((el*)a)->s - ((el*)b)->s);}

int getp(int a)
{
    int k=a;
    while(k!=par[k]) k=par[k];
    return par[a]=k;
}

void mergee(int a, int b)
{
    if(P[a]<P[b]) a^=b^=a^=b;
    par[b]=a;
    P[a]+=P[a]==P[b];
}

int main()
{
    freopen("apm.in","r",stdin);
    scanf("%d%d",&n,&m);
    par=(int*)malloc((n)*sizeof(int));
    P=(int*)malloc((n)*sizeof(int));
    el *t=(el*)malloc(m*sizeof(el));
    fr(i,0,m) scanf("%d%d%d",&t[i].fp,&t[i].ep,&t[i].s),--t[i].fp,--t[i].ep;
    fr(i,0,n) par[i]=i,P[i]=1;
    qsort(t,m,sizeof(el),cmp);
    int*x=(int*)malloc((n)*sizeof(int));
    int*y=(int*)malloc((n)*sizeof(int));
    int w=0;
    fr(i,0,m)
    {
        int A=getp(t[i].fp);
        int B=getp(t[i].ep);
        if(A==B) continue;
        x[w]=t[i].fp,y[w]=t[i].ep;++w;
        ss+=t[i].s;
        mergee(A,B);
    }

    printf("%d\n%d\n",ss,w);
    fr(i,0,w) printf("%d %d\n",++x[i],++y[i]);
    return 0;
}