Cod sursa(job #881309)

Utilizator mmanMihai Manolescu mman Data 17 februarie 2013 21:23:28
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include<fstream>
#include<algorithm>
#define dmax 400003
#define nmax 200003
using namespace std;
ifstream in("apm.in");
ofstream out("apm.out");

int n, m, apm[nmax], p[nmax], dpt[nmax]; 

struct edge
{
	int a;
	int b;
	short int c;
}	edg[dmax];

int sf(edge x, edge y)
{
	return x.c < y.c;
}


void merge(int a, int b)
{
	while(p[a] != 0)
		a = p[a];
	
	while(p[b] != 0)
		b = p[b];
	
	if(dpt[a] < dpt[b])
		p[a] = b;
	else if(dpt[a] > dpt[b])
		p[b] = a;
	else if(dpt[a] == dpt[b])
	{
		p[a] = b;
		dpt[b]++;
	}	
}

bool conn(int a, int b)
{
	while(p[a] != 0)
		a = p[a];
	
	while(p[b] != 0)
		b = p[b];
	
	return (a==b);
}

void kruskal()
{
	int nr=0, crt=1, cost=0;
	
	for(int i=1; i<=n; i++)
		dpt[i] = 1;
	
	while(nr < n-1)
	{
		while(conn(edg[crt].a, edg[crt].b))
			crt++;			
		
		nr++;
		apm[nr] = crt;
		cost += edg[crt].c;
		
		merge(edg[crt].a, edg[crt].b);
	}
	
	out<<cost<<'\n';
}	

int main()
{
	in>>n>>m;

	for(int i=1; i<=m; i++)
	{
		in>>edg[i].a>>edg[i].b>>edg[i].c;
	}
	
	in.close();

	sort(edg+1, edg+m+1, sf);	
	

	kruskal();
	
	out<<n-1<<'\n';
	
	for(int i=1; i<n; i++)
		out<<edg[apm[i]].a<<" "<<edg[apm[i]].b<<'\n';

	out.close();
	return 0;
}