Cod sursa(job #259781)

Utilizator vladbBogolin Vlad vladb Data 15 februarie 2009 20:24:46
Problema Arbore partial de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include<fstream.h>

ofstream fout("apm.out");

long long int m1[400000],t[400000],h[400000];
long long int p,n,m,k=1,nr;
struct nod { long long int a,b,c;
	   };
nod a[400000];

void citire()
{       long long int i;
	ifstream fin("apm.in");
	fin>>n>>m;
	for(i=1;i<=m;i++)
		fin>>a[i].a>>a[i].b>>a[i].c;
	fin.close();
}

void quick(long long int x,long long int y)
{    long long int i,j,p=0;
     nod aux;
     if(x<y)
     {	i=x-1;
	j=y+1;
	p=a[(x+y)/2].c;
	while(i<j)
	{   do i++; while(a[i].c<p);
	    do j--; while(a[j].c>p);
	    if(i<j) {  aux=a[i];
		       a[i]=a[j];
		       a[j]=aux;
		    }
	}
	quick(x,i-1);
	quick(j+1,y);
     }
}

long long int arb(long long no)
{   while(t[no]) no=t[no];
    return no;
}

int main()
{	citire();
	quick(1,m);
	k=1;
	do {  while(arb(a[k].a)==arb(a[k].b)) k++;
	      nr++;
	      p+=a[k].c;
	      m1[k]=1;
	      if(h[a[k].a]==h[a[k].b])
	      {	t[a[k].a]=a[k].b;
		h[a[k].a]++;
	      }
	      else if(h[a[k].a]<h[a[k].b])
			t[a[k].a]=a[k].b;
		   else t[a[k].b]=a[k].a;
	      k++;
	   }while(nr<n-1);
	fout<<p<<"\n"<<nr<<"\n";
	for(long long int i=1;i<=m;i++)
	    if(m1[i]==1) fout<<a[i].a<<" "<<a[i].b<<"\n";
	fout.close();
	return 0;
}