Cod sursa(job #651874)

Utilizator CS-meStanca Marian Ciprian CS-me Data 21 decembrie 2011 22:40:45
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.94 kb
#include <stdio.h>
#include <algorithm>
using namespace std;
FILE *fin=fopen("apm.in","r");
FILE *fout=fopen("apm.out","w");
int n,m,h[200002],t1,t2;

struct muchii{
	int i,j,c;
};
muchii v[400002];
int a[400002],i,j,k,cost;


int cmp(const muchii &a,const muchii &b){
	return a.c<b.c;
}

int tata(int x){
	while(h[x]>0){
		x=h[x];
	}
	return x;
}

int main(){

	fscanf(fin,"%d %d\n",&n,&m);

    for(i=1;i<=n;i++)
	{
		h[i]=-1;
	}

	for(i=1;i<=m;i++)
	{
		fscanf(fin,"%d %d %d",&v[i].i,&v[i].j,&v[i].c);
	}


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

	for(i=1;i<=m && k<n-1;i++)
	{
		t1=tata(v[i].i);
		t2=tata(v[i].j);

		if(t1!=t2)
		{
			a[++k]=i;
			cost+=v[i].c;

			if(h[t1]<h[t2])
			{
				h[t1]+=h[t2];
				h[t2]=t1;
			}
			else
			{
				h[t2]+=h[t1];
				h[t1]=t2;
			}
		}
	}

	fprintf(fout,"%d\n%d\n",cost,k);

	for(i=1;i<=k;i++)
	{
		fprintf(fout,"%d %d\n",v[a[i]].i,v[a[i]].j);
	}
return 0;
}