Cod sursa(job #602214)

Utilizator balakraz94abcd efgh balakraz94 Data 9 iulie 2011 19:52:02
Problema Arbore partial de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include<cstdio>
#include<vector>
#include<algorithm>
#define infile "apm.in"
#define outfile "apm.out"
#define n_max 200005
#define m_max 400005
using namespace std;


void citeste();
void rezolva();
void afiseaza();


struct muchie 
{ 
	int n1,n2,cost;
} G[m_max];

int c[n_max], apm[n_max];
int n,m,cmin,nrm;



void citeste()
{
	freopen(infile,"r",stdin);
	
	scanf("%d %d",&n,&m);
	
	for(int i=1;i<=m;i++)
		scanf("%d %d %d", &G[i].n1, &G[i].n2, &G[i].cost);
	
	for(int i=1;i<=n;i++)
		c[i]=i;
	
	fclose(stdin);
}



int mycmp(muchie a, muchie b)
{
	return a.cost < b.cost;
}



void rezolva()
{
	sort(G+1,G+m+1,mycmp);
	
	int minim,maxim;
	
	for(int i=1;i<=m && nrm < n-1; i++)
	{
		if(c[G[i].n1] != c[G[i].n2])
		{
			apm[++nrm]=i;
			cmin+=G[i].cost;
			
			minim = c[G[i].n1];
			maxim = c[G[i].n2];
			
			if(c[G[i].n1] > c[G[i].n2])
				swap(minim,maxim);

			for(int j=1;j<=n;j++)
				if(c[j] == maxim)
					c[j] = minim;
		}
	}
}



void afiseaza()
{
	freopen(outfile,"w",stdout);
	
	printf("%d\n",cmin);
	
	for(int i=1;i<=nrm;i++)
		printf("%d %d\n",G[apm[i]].n1, G[apm[i]].n2);
	
	fclose(stdout);
}

int main()
{
	citeste();
	rezolva();
	afiseaza();
	
	return 0;
}