Cod sursa(job #295052)

Utilizator nicolaetitus12Nicolae Titus nicolaetitus12 Data 2 aprilie 2009 22:30:29
Problema Arbore partial de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <stdio.h>
#include <stdlib.h>
#define M 400001
#define N 200001
int muc[2*M],urm[2*M],back[2*M],id[2*M],vec[N],tata[N],n,m,vf;
int lg[N];
short int cost[2*M];
char viz[2*M];
void sort (int st,int dr)
{int s=st,d=dr,p=cost[id[st+rand()%(dr-st+1)]],aux;
 while(s<d)
 {while(cost[id[s]]<p)s++;
  while(cost[id[d]]>p)d--;
  if(s<=d)
  {aux=id[s];id[s]=id[d];id[d]=aux;
   s++;
   d--;
  }
 }
 if(s<dr)sort(s,dr);
 if(st<d)sort(st,d);
}
void adauga(int x,int y,int z)
{muc[vf]=y;
 back[vf]=x;
 cost[vf]=z;
 urm[vf]=vec[x];
 vec[x]=vf;
 vf++;
}

int main ()
{int i,x,y,z,p,q,S;
 freopen("apm.in","r",stdin);
 freopen("apm.out","w",stdout);
 scanf("%d %d",&n,&m);
 for (i=1,vf=1;i<=m;i++)
 {scanf("%d %d %d",&x,&y,&z);
  adauga(x,y,z);
  adauga(y,x,z);
 }
 for (i=1;i<=2*m;i++)id[i]=i;
 sort(1,2*m);
 for (i=1,S=0;i<=2*m;i++)
 {for(q=back[id[i]];tata[q];q=tata[q]);
  for(p=muc[id[i]];tata[p];p=tata[p]);
  if(p==q)continue;
  S+=cost[id[i]];
  viz[i]=1;
  if(lg[p]>lg[q])
  {tata[q]=p;
  }
  else if(lg[q]>lg[p])
  {tata[p]=q;}
  else
  {lg[p]++;
   tata[q]=p;
  }
 }
 printf("%d\n%d\n",S,n-1);
 for (i=1;i<=2*m;i++)
 {if(viz[i])
  printf("%d %d\n",back[id[i]],muc[id[i]]);
 }
 return 0;
}