Cod sursa(job #254226)

Utilizator eugen.nodeaEugen Nodea eugen.nodea Data 7 februarie 2009 01:17:28
Problema Arbore partial de cost minim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
# include <stdio.h>
# define nmax 200001
# define mmax 400001
struct muchie{
	int x,y,ct;
}G[mmax],S[mmax];
int N,M,C[nmax];
long CT;
void sort(int st,int dr)
{
    int i=st,j=dr;
    muchie p=G[(i+j)/2],tmp;
    do{
	while (G[i].ct<p.ct) ++i;
	while (p.ct<G[j].ct) --j;
	if (i<=j){
	    tmp=G[i], G[i]=G[j],G[j]=tmp;
	    ++i; --j;
	}
    } while (i<=j);
    if (i<dr) sort(i,dr);
    if (st<j) sort(st,j);
}
int main(){
  int i,a,b,k=0,j;
  freopen("apm.in", "r", stdin);
  freopen("apm.out", "w", stdout);
  scanf("%d %d",&N,&M);
  for (i=1;i<=M;++i)
    scanf("%d %d %d",&G[i].x,&G[i].y,&G[i].ct);
  sort(1,M);
  for (i=1;i<=M;++i) C[i]=i;
  for (i=1;i<=M;++i){
    if (C[G[i].x]!=C[G[i].y]){
	k++;
	CT+=G[i].ct; S[k]=G[i];
	a=G[i].x; b=G[i].y;
	for (j=1;j<=M;j++)
	  if (C[j]==C[a]) C[j]=C[b];
      }
      if (k==N-1) break;
   }
  printf("%ld\n",CT);
  printf("%d\n",N-1);
  for (i=1;i<=k;++i)
     printf("%d %d\n",S[i].x,S[i].y);
  return 0;
}