Cod sursa(job #382973)

Utilizator Alexa_ioana_14Antoche Ioana Alexandra Alexa_ioana_14 Data 15 ianuarie 2010 10:28:48
Problema Arbore partial de cost minim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include<cstdio>
#include<algorithm>
using namespace std;
#define N 200001
#define M 400001
int rez[M],x[M],y[M],c[M],gr[N],n,m,ind[M],cost;
bool compar(int a,int b)
{
	return c[a]<=c[b];
}
void citire()
{
	freopen("apm.in","r",stdin);
	freopen("apm.out","w",stdout);
	scanf("%d%d",&n,&m);
	for (int i=1; i<=m; ++i)
	{
		scanf("%d%d%d",&x[i],&y[i],&c[i]);
		ind[i]=i;
	}
	sort(ind+1,ind+1+m,compar);
}
int grupa(int i)
{
	if (i==gr[i])
		return i;
	gr[i]=grupa(gr[i]);
	return gr[i];
}
void unesc(int i, int j)
{
	gr[grupa(i)]=grupa(j);
}
void apm()
{
	for (int i=1; i<=n; ++i)
		gr[i]=i;
	for (int i=1; i<=m; ++i)
	{
		if (grupa(x[ind[i]])!=grupa(y[ind[i]]))
		{
			unesc(x[ind[i]],y[ind[i]]);
			rez[++rez[0]]=ind[i];
			cost+=c[ind[i]];
		}
	}
}
void afis()
{
	printf("%d\n%d\n",cost,rez[0]);
	for (int i=1; i<=rez[0]; ++i)
		printf("%d %d\n",x[rez[i]],y[rez[i]]);
}
int main()
{
	citire();
	apm();
	afis();
	return 0;
}