Cod sursa(job #385525)

Utilizator Alexa_ioana_14Antoche Ioana Alexandra Alexa_ioana_14 Data 22 ianuarie 2010 21:19:16
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include<cstdio>
#include<algorithm>
using namespace std;
#define N 200001
#define M 400001
int x[M],y[M],ind[M],n,m,cost,sol[N],gr[N],rang[N];
short int c[M];
bool compar(const int  &i, const int &j)
{
	return c[i]<c[j];
}
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%hd",&x[i],&y[i],&c[i]);
		ind[i]=i;
	}
	sort(ind+1,ind+m+1,compar);
}
int find(int x)
{
	if (gr[x]!=x)
		gr[x]=find(gr[x]);
	return gr[x];
}
void unesc(int x,int y)
{
	if (rang[x]<rang[y])
		gr[x]=y;
	else
	{
		gr[y]=x;
		rang[x]+=(rang[x]==rang[y]);
	}
}
void apm()
{
	for (int i=1; i<=n; ++i)
		gr[i]=i,rang[i]=1;
	for (int i=1;i<=m; ++i)
	{
		int x1=find(x[ind[i]]),y1=find(y[ind[i]]);
		if (x1!=y1)
		{
			unesc(x1,y1);
			cost+=c[ind[i]];
			sol[++sol[0]]=ind[i];
		}
	}
}
void afis()
{
	printf("%d\n%d\n",cost,sol[0]);
	for (int i=1; i<=sol[0]; ++i)
		printf("%d %d\n",x[sol[i]],y[sol[i]]);
}
int main()
{
	citire();
	apm();
	afis();
	return 0;
}