Cod sursa(job #709953)

Utilizator iuli1505Parasca Iuliana iuli1505 Data 8 martie 2012 18:48:37
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include<cstdio>
#include<vector>
#include<utility>
#include<algorithm>
#define nmax 200001
using namespace std;
vector<pair<int,pair<int,int> > > G;
int n,m,x,y,cost,sum,dad[nmax],nr;
vector<int> child[nmax];
vector<pair<int,int> > sol;
void citire()
{
	int i;
	scanf("%d%d", &n, &m);
	for(i=1;i<=n;i++)
	{
		dad[i]=i;
		child[i].push_back(i);
	}
	for(i=1;i<=m;i++)
	{
		scanf("%d%d%d", &x, &y, &cost);
		G.push_back(make_pair(cost,make_pair(x,y)));
	}
}
int main()
{
	int min,max;
	vector<pair<int, pair<int,int> > >::iterator it;
	vector<int>::iterator IT;
	freopen("apm.in","r",stdin);
	freopen("apm.out","w",stdout);
	citire();
	sort(G.begin(),G.end());
	for(it=G.begin();it!=G.end()&&nr!=n-1;it++)
	{
		pair<int, pair<int,int> > nod=*it;
		if(dad[nod.second.first]!=dad[nod.second.second])
		{
			nr++;
			sum+=nod.first;
			sol.push_back(make_pair(nod.second.first,nod.second.second));
			if(dad[nod.second.first]<dad[nod.second.second])
			{
				min=dad[nod.second.first];
				max=dad[nod.second.second];
			}
			else
			{
				min=dad[nod.second.second];
				max=dad[nod.second.first];
			}
			for(IT=child[max].begin();IT!=child[max].end();IT++)
			{
				dad[*IT]=min;
				child[min].push_back(*IT);
			}
		}
	}
	printf("%d\n%d\n", sum, n-1);
	for(int i=0;i<n-1;i++)
		printf("%d %d\n",sol[i].first,sol[i].second); 
	return 0;
}