Cod sursa(job #742831)

Utilizator adysnookAdrian Munteanu adysnook Data 1 mai 2012 19:59:25
Problema Arbore partial de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 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(){
	{//citire
		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;
		}
	}
	{//Kruskal
		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);
			}
		}
	}
	{//afisare
		fpo<<sum<<endl<<msel<<endl;
		for(i=0; i<msel; i++)
			fpo<<E1[ES[i]]<<" "<<E2[ES[i]]<<endl;
	}
	return 0;
}