Cod sursa(job #729483)

Utilizator ILDottoreBogdan Stoian ILDottore Data 29 martie 2012 17:19:26
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;

#define MMAX 400005
#define NMAX 200005

FILE *f=fopen("apm.in","r");
FILE *g=fopen("apm.out","w");

struct muchie{ long x,y,c;};

struct cmp{ 
	bool operator() ( muchie v1, muchie v2)
	{  return v1.c<v2.c;}
		  };

long n,m,cost,nrm,R[NMAX],rang[NMAX];
muchie v[MMAX]; 

vector<long> sol;


long multime(long nod)
{
	long root=nod,aux;
	
	while(R[root]!=root)
		root=R[root];
	
	
	
	while(R[nod]!=root)
	{  aux=nod;
	   nod=R[nod];
	   R[aux]=root;
	}

	
return root;
}

void reuneste(long r1,long r2)
{
	if (rang[r1]>rang[r2])
		{R[r2]=r1;
		 return;}
		
	if (rang[r1]<rang[r2])
		{R[r1]=r2;
		return ;}

	
  rang[r1]++;
  R[r2]=r1;
}  

void apm()
{
	for (long i=1;i<=m;i++)
	{ long a=multime(v[i].x);
	  long b=multime(v[i].y);
	
	  if (a==b) continue;
	  
	  cost+=v[i].c;
	  nrm++;
	  sol.push_back(i);
	  reuneste(a,b);
	}
}
	
	


int main()
{
		fscanf(f,"%ld%ld",&n,&m);
		for (long i=1;i<=m;i++)
			fscanf(f,"%ld%ld%ld",&v[i].x,&v[i].y,&v[i].c);
		sort(v+1,v+m+1, cmp() );
	
		for (long i=1;i<=n;i++)
			R[i]=i;
			
			
		apm();
		
		fprintf(g,"%ld\n%ld\n",cost,nrm);
		
		for (long i=0;i<sol.size();i++)
		fprintf(g,"%ld %ld\n",v[ sol[i] ].x,v[ sol[i] ].y); 	
return 0;}