Cod sursa(job #696067)

Utilizator dicu_dariaDaria Dicu dicu_daria Data 28 februarie 2012 16:36:09
Problema Arbore partial de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.79 kb
#include <fstream>
#include <algorithm>
#define M 400010
#define N 200010
using namespace std;
int t[N],i,n,m,cost,k,apm[N],x[M],y[M],c[M],ind[M];
bool cmp(int a,int b)
{
	return c[a]<c[b];
}
int grupa(int nod)
{
	if(t[nod]==nod) return nod;
	t[nod]=grupa(t[nod]);
	return t[nod];
}
void reunite(int a, int b)
{
	int s=grupa(a);
	t[s]=grupa(b);
}
int main()
{
	ifstream fi("apm.in");
	ofstream fo("apm.out");
	fi>>n>>m;
	for(i=1;i<=n;i++) t[i]=i;
	for(i=1;i<=m;i++)
	{
		fi>>x[i]>>y[i]>>c[i];
		ind[i]=i;
	}
	sort(ind+1,ind+m+1,cmp);
	for(i=1,k=1;i<m and k<n;i++)
	if(grupa(x[ind[i]])!=grupa(y[ind[i]]))
	{
		reunite(x[ind[i]],y[ind[i]]);
		cost+=c[ind[i]];
		apm[k]=ind[i]; 
		k++;
	}
	fo<<cost<<"\n";
	for(i=1;i<k;i++) fo<<x[apm[i]]<<" "<<y[apm[i]]<<"\n";
	return 0;
}