Cod sursa(job #314014)

Utilizator adelinavVidovici Adelina adelinav Data 10 mai 2009 13:20:40
Problema Arbore partial de cost minim Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include<stdio.h>
#include<stdlib.h>
#define NMAX 200000
#define MMAX 400000

int n,m,cc[NMAX+1],costtotal;

struct muchie{
	int x,y,c;
};
typedef muchie *pm;
muchie v[MMAX],h[NMAX+1];

struct nod{
	int info;
	nod *adr;
};
typedef nod *pnod;
struct lista{
	pnod vf,sf;
};

lista l[NMAX+1];

int fcmp(void const *a,void const *b){
	return ((pm)a)->c-((pm)b)->c;
}

void apm(){
	int i=0,j=0,ms=0,min,max,k=0;
	pnod nc;
	while(ms<n-1){
		while(cc[v[i].x]==cc[v[i].y]) i++;
		h[k]=v[i],k++;
		costtotal+=v[i].c;
		if(v[i].x<v[i].y){
			min=cc[v[i].x];
			max=cc[v[i].y];
		}
		else{
			min=cc[v[i].y];
			max=cc[v[i].x];
		}
	   /*	for(j=1;j<=n;j++)
			if(cc[j]==max)
				cc[j]=min;    */
		nc=l[max].vf;
		while(nc){
			cc[nc->info]=min;
			nc=nc->adr;
		}
		l[min].sf->adr=l[max].vf;
		l[max].vf=NULL;
        ms++;

	}
}

int main(){
freopen("apm.in","r",stdin);
freopen("apm.out","w",stdout);
int i;
pnod nn;
scanf("%d%d",&n,&m);
for(i=0;i<m;i++)
	scanf("%d%d%d",&v[i].x,&v[i].y,&v[i].c);
qsort(v,m,sizeof(v[0]),fcmp);
for(i=1;i<=n;i++){
	cc[i]=i;
	nn=new nod;
	nn->info=i;
	nn->adr=NULL;
	l[i].vf=nn;
	l[i].sf=nn;
}
apm();
printf("%d\n%d\n",costtotal,n-1);
for(i=0;i<n-1;i++)
	printf("%d %d\n",h[i].x,h[i].y);
return 0;
}