Cod sursa(job #1453446)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 23 iunie 2015 15:52:43
Problema Arbore partial de cost minim Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.47 kb
#include <stdio.h>
#include <stdlib.h>
#define MAXM 400001
#define MAXN 200001
int w[MAXM],y[MAXM],x[MAXM],sef[MAXN];
char vf[MAXM];
void myqsort(int begin,int end){
    int b=begin,e=end,aux1,aux2,aux3,pivot=w[(b+e)/2];
    while(b<=e){
        while(w[b]<pivot) b++;
        while(w[e]>pivot) e--;
        if(b<=e){
            aux1=w[b];aux2=x[b];aux3=y[b];
            w[b]=w[e];x[b]=x[e];y[b]=y[e];
            w[e]=aux1;x[e]=aux2;y[e]=aux3;
            b++;e--;
        }
    }
    if(begin<e) myqsort(begin,e);
    if(b<end) myqsort(b,end);
}
inline int myfind(int nod){
    int aux,nod1=nod;
    while(sef[nod]>0)
        nod=sef[nod];
    while(sef[nod1]>0){
        aux=sef[nod1];
        sef[nod1]=nod;
        nod1=aux;
    }
    return nod;
}
inline void myunion(int nod1,int nod2){
    sef[myfind(nod1)]=myfind(nod2);
}
int main(){
    FILE*fi,*fout;
    int i,n,m,con,s;
    fi=fopen("apm.in" ,"r");
    fout=fopen("apm.out" ,"w");
    fscanf(fi,"%d%d" ,&n,&m);
    for(i=1;i<=m;i++)
       fscanf(fi,"%d%d%d" ,&x[i],&y[i],&w[i]);
    myqsort(1,m);
    con=s=0;
    i=1;
    while(con<n-1){
        if(myfind(x[i])!=myfind(y[i])){
            con++;
            s+=w[i];
            vf[i]=1;
            myunion(x[i],y[i]);
        }
        i++;
    }
    fprintf(fout,"%d\n%d\n" ,s,n-1);
    for(i=1;i<=m;i++)
        if(vf[i])
           fprintf(fout,"%d %d\n" ,x[i],y[i]);
    fclose(fi);
    fclose(fout);
    return 0;
}