Pagini recente » Cod sursa (job #1478397) | Cod sursa (job #1748306) | Cod sursa (job #1538732) | Cod sursa (job #1282724) | Cod sursa (job #1453446)
#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;
}