Cod sursa(job #742833)

Utilizator adysnookAdrian Munteanu adysnook Data 1 mai 2012 20:00:21
Problema Arbore partial de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include <fstream>
#include <algorithm>
#include <stdio.h>

#define N 200000

using namespace std;

int E1[2*N], E2[2*N], EC[2*N], Ei[2*N], ES[N], NP[N+1], n, m, i, msel=0, a, b;
long long sum=0;
FILE *fpi = fopen("apm.in", "r");
ofstream fpo("apm.out");

bool compara(int a, int b){
	return EC[a]<EC[b];
}

int gaseste(int i){
	int rad=i, z;
	while(rad!=NP[rad])
		rad=NP[rad];
	while(i!=NP[i]){
		z=NP[i];
		NP[i]=rad;
		i=z;
	}
	return rad;
}

void uneste(int x, int y){
	NP[x]=y;
}

int main(){
	fscanf(fpi, "%d %d", &n, &m);
	for(i=0; i<m; i++){
		fscanf(fpi, "%d %d %d", &E1[i], &E2[i], &EC[i]);
		Ei[i]=i;
	}
	for(i=1; i<=n; i++)
		NP[i]=i;
	sort(Ei, Ei+m, compara);
	for(i=0; i<m; i++){
		a=gaseste(E1[Ei[i]]);
		b=gaseste(E2[Ei[i]]);
		if(a != b){
			ES[msel++]=Ei[i];
			sum+=EC[Ei[i]];
			if(msel==n-1)
				break;
			uneste(a, b);
		}
	}
	fpo<<sum<<endl<<msel<<endl;
	for(i=0; i<msel; i++)
		fpo<<E1[ES[i]]<<" "<<E2[ES[i]]<<endl;
	return 0;
}