Cod sursa(job #405661)

Utilizator antoanelaAntoanela Siminiuc antoanela Data 28 februarie 2010 15:41:11
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.85 kb
#include <cstdio>
#define f first
#define s second
#include <vector>
#include <algorithm>
using namespace std;

vector <pair <int, int> > sol;
vector <pair <int, pair<int, int> > > v;
int n, m, cost, t[200010];

int tata(int x)
{
	if (x!=t[x]) t[x]=tata(t[x]);
	return t[x];
}

int main()
{
	freopen("apm.in","r",stdin);
	freopen("apm.out","w",stdout);
	scanf("%d %d",&n,&m);
	int i, x, y, c;
	for (i=1; i<=m; i++)
	{
		scanf("%d %d %d",&x,&y,&c);
		v.push_back(make_pair(c,make_pair(x,y)));
	}
	sort(v.begin(), v.end());
	for (i=1; i<=n; i++) t[i]=i;
	int j;
	for (i=0; i<m; i++)
	{
		x=tata(v[i].s.f);
		y=tata(v[i].s.s);
		if (x!=y)
		{
			cost +=v[i].f;
			t[x]=y;
			sol.push_back(make_pair(v[i].s.f, v[i].s.s));
		}
	}
	printf("%d\n%d\n",cost,sol.size());
	for (i=0; i<sol.size(); i++) printf("%d %d\n",sol[i].f,sol[i].s);
}