Cod sursa(job #235667)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 25 decembrie 2008 03:27:27
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.72 kb
#include<stdio.h>
#define N 200010
#define M 400010
int n,m,i,j,a[M],b[M],c[M],d[N],ca[N],cb[N],la,lb,conexe(int aa,int bb);
void readd(),sort(),sw(int i1,int i2),hd(int ic,int nc),
kruskal(),conecteaza(int aa,int bb),prints();
int main()
{
	readd();
	sort();
	kruskal();
	prints();
	return 0;
}
void readd()
{
	freopen("apm.in","rt",stdin);
	freopen("apm.out","wt",stdout);
	scanf("%d%d",&n,&m);
	for(i=1;i<=m;i++)scanf("%d%d%d",&a[i],&b[i],&c[i]);
}
void sort()
{
	for(i=m/2;i>=1;i--)hd(i,m);
	for(i=m;i>=1;i--){sw(1,i);hd(1,i-1);}
}
void sw(int i1,int i2)
{
	int aux=a[i1];a[i1]=a[i2];a[i2]=aux;
	    aux=b[i1];b[i1]=b[i2];b[i2]=aux;
	    aux=c[i1];c[i1]=c[i2];c[i2]=aux;
}
void hd(int ic,int nc)
{
	int is=ic<<1;
	if(is>nc)return;
	if(is<nc&&c[is]<c[is+1])is++;
	if(c[is]>c[ic]){sw(is,ic);hd(is,nc);}
}


void kruskal()
{
    for(i=1;i<=n;i++)d[i]=i;
    for(i=1,j=1;j<n;i++)
    { if(conexe(a[i],b[i]))continue;
      conecteaza(a[i],b[i]);
      a[j]=a[i];b[j]=b[i];c[j]=c[i];j++;
    }
}
void conecteaza(int aa,int bb)
{ int ia,ib;
  la=0;do{ ca[++la]=aa;aa=d[aa];}while(d[aa]-aa);ca[++la]=aa;
  lb=0;do{ cb[++lb]=bb;bb=d[bb];}while(d[bb]-bb);cb[++lb]=bb;
  aa=(aa<bb)?aa:bb;
  for(ia=1;ia<=la;ia++)d[ca[ia]]=aa;
  for(ib=1;ib<=lb;ib++)d[cb[ib]]=aa;
}
int conexe(int aa,int bb)
{ int ia,ib;
  la=0;do{ ca[++la]=aa;aa=d[aa];}while(d[aa]-aa);ca[++la]=aa;
  lb=0;do{ cb[++lb]=bb;bb=d[bb];}while(d[bb]-bb);cb[++lb]=bb;
  for(ia=1;ia<=la;ia++)d[ca[ia]]=aa;
  for(ib=1;ib<=lb;ib++)d[cb[ib]]=bb;
 if(aa==bb)return 1;return 0;
}
void prints()
{       int capm=0;
	for(i=1;i<n;i++)capm+=c[i];
	printf("%d\n",capm);
	n--;
	printf("%d\n",n);
	for(i=1;i<=n;i++)printf("%d %d\n",a[i],b[i]);
}