Cod sursa(job #800020)

Utilizator RaduDoStochitoiu Radu RaduDo Data 20 octombrie 2012 16:23:51
Problema Arbore partial de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include<iostream>
#include<cstdio>
#define NMAX 200005
#define MMAX 400005
using namespace std;
struct Muchie {int e1,e2,cost;};
Muchie G[MMAX];
int A[NMAX],c[NMAX];
int n,m,i,j,mini,maxi,NrMSel;

void Citire()
{
	int i;
	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",&G[i].e1,&G[i].e2,&G[i].cost);
	for(i=1;i<=n;++i)
		c[i]=i;
}

void SortareMuchii(int st,int dr)
{
	int i,j;Muchie x;
	if(st<dr)
	{
		x=G[st]; i=st; j=dr;
		while(i<j)
		{
			while(i<j&&G[j].cost>=x.cost)
				j--;
			G[i]=G[j];
			while(i<j&&G[j].cost<=x.cost)
				i++;
			G[j]=G[i];
		}
		G[i]=x;
		SortareMuchii(st,i-1);
		SortareMuchii(i+1,dr);
	}
}

void Afisare()
{
	int i,CostAPM=0;
	for(i=1;i<n;++i)
	{
		CostAPM+=G[A[i]].cost;
	}
	printf("%d\n",CostAPM);
	for(i=1;i<n;++i)
		printf("%d %d\n",G[A[i]].e1,G[A[i]].e2);
}

int main()
{
	Citire();
	SortareMuchii(1,m);
	NrMSel=0;
	for(i=1; NrMSel<n-1; ++i)
		if(c[G[i].e1]!=c[G[i].e2])
		{
			A[++NrMSel]=i;
			if(c[G[i].e1]<c[G[i].e2])
			{
				mini=c[G[i].e1];
				maxi=c[G[i].e2];
			}
			else
			{
				maxi=c[G[i].e1];
				mini=c[G[i].e2];
			}
			for(j=1;j<=n;++j)
				if(c[j]==maxi)
					c[j]=mini;
		}
	Afisare();
	return 0;
}