Cod sursa(job #289835)

Utilizator ConsstantinTabacu Raul Consstantin Data 27 martie 2009 08:12:15
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
	 #include<stdio.h>
#include<algorithm>
using namespace std;

	 struct muchie{int a,b,c;}v[400004];

	 int sol[400002];
	 int i,p,k,cost=0,m,n,nr[200002],tt[200040];

	int cmp(muchie a,muchie b){

	return a.c<b.c;}


	void merge(int a,int b){
	if(nr[a]>nr[b])
		tt[b]=a;
	else
		tt[a]=b;
	}

	int find(int val){
	int r=val,y;
	for(;tt[r]!=r;r=tt[r]);

	for(;tt[val]!=val;){
		y=tt[val];
		tt[val]=r;
		val=y;
		}

	return r;
	}

	int main(){

	freopen("apm.in","r",stdin);
	freopen("apm.out","w",stdout);
	scanf("%d %d",&n,&m);

	for(i=1;i<=n;i++)
			  {tt[i]=i;
				nr[i]=1;
			  }

	for(i=1;i<=m;i++)
			  scanf("%d %d %d",&v[i].a,&v[i].b,&v[i].c);

	sort(v+1,v+1+m,cmp);

	for(i=1;i<=m;i++)
			  if(find(v[i].a)!=find(v[i].b))
						 {cost+=v[i].c;
						 k++;
						 sol[k]=i;
						 merge(find(v[i].a),find(v[i].b));}

	printf("%d\n%d\n",cost,k);

	for(i=1;i<=k;i++)
			  printf("%d %d\n",v[sol[i]].a,v[sol[i]].b);

	return  0;}