Cod sursa(job #748095)

Utilizator roots4Irimia Alexandru Gabriel roots4 Data 12 mai 2012 14:41:30
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include<stdio.h>
#include<algorithm>
#define dim 400010
using namespace std;
FILE*f=fopen("apm.in","r");
FILE*g=fopen("apm.out","w");

int n , m , i ,P[200010],nr,cost;
bool Fr[dim];
struct muchie{
	int x;
	int y;
	int c;
}V[dim];

int cmp(muchie a, muchie b){
	if(a.c<b.c)
		return 1;
	return 0;
}

int query(int a, int b){
	while(P[a]>0)
		a=P[a];
	while(P[b]>0)
		b=P[b];
	if(a!=b)
		return 1;
	return 0;
}

void update(int a, int b){
	while(P[a]>0)
		a=P[a];
	while(P[b]>0)
		b=P[b];
	if(P[a]>P[b])
		P[b]+=P[a],P[a]=b;
	else
		P[a]+=P[b],P[b]=a;
}

int main(){
	fscanf(f,"%d%d",&n,&m);
	for(i=1;i<=m;i++)
		fscanf(f,"%d%d%d",&V[i].x,&V[i].y,&V[i].c);
	
	sort(V+1,V+m+1,cmp);
	
	for(i=1;i<=n;i++)
		P[i]=-1;
	
	for(i=1;i<=m;i++){
		if(query(V[i].x,V[i].y)){
			update(V[i].x,V[i].y),cost+=V[i].c;
			Fr[i]=1;
			nr++;
		}
	}
	
	fprintf(g,"%d\n%d\n",cost,nr);
	for(i=1;i<=m;i++)
		if(Fr[i])
			fprintf(g,"%d %d\n",V[i].x,V[i].y);
	return 0;
}