Cod sursa(job #526171)

Utilizator CBogdanCiobanu Bogdan CBogdan Data 27 ianuarie 2011 17:31:54
Problema Arbore partial de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;

int n,m,x,y,i,cost,X[400010],Y[400010],C[400010],IND[400010],T[400010],R[400010],grupa(int);
vector <int> MUCHII;

void read(),solve(),uneste(int,int);

int main()
{
	read();
	solve();
	
	return 0;
}

bool comp(int x,int y)
{
	return (C[x]<C[y]);
}

void read()
{
	freopen("apm.in","r",stdin);
	freopen("apm.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(i=1;i<=m;i++)
	{
		scanf("%d%d%d",&X[i],&Y[i],&C[i]);
		IND[i]=i;
		T[i]=i;
	}
	for(i=1;i<=m;i++)
		R[i]=1;
}

void solve()
{
	sort(IND+1,IND+m+1,comp);
	T[5]=2;
	R[2]=2;
	for(i=1;i<=m;i++)
	{
		x=grupa(X[IND[i]]);
		y=grupa(Y[IND[i]]);
		if(x!=y)
		{
			cost+=C[IND[i]];
			uneste(x,y);
			MUCHII.push_back(IND[i]);
		}
	}
	printf("%d\n",cost);
	//printf("%d\n",n-1);
	//for(i=0;i<n-1;i++) printf("%d %d\n",X[MUCHII[i]],Y[MUCHII[i]]);
}

int grupa(int x)
{
	int aux,t;
	for(t=x;t!=T[t];t=T[t]);
	for(;x!=T[x];)
	{
		aux=T[x];T[x]=t;x=aux;
	}
	return t;
}

void uneste (int x,int y)
{
	if(R[x]>=R[y])T[y]=x,R[x]+=R[y];
	else T[x]=y,R[y]+=R[x];
}