Cod sursa(job #811527)

Utilizator SebiSebiPirtoaca George Sebastian SebiSebi Data 12 noiembrie 2012 16:06:28
Problema Radiatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include<iostream>
#include<fstream>
#include<vector>
#include<algorithm>
using namespace std;

#define NMAX 30001
#define mp make_pair
#define pb push_back
#define x first
#define y second

vector < pair < int , pair < int , int > > > v;
int p[NMAX],rang[NMAX],c[NMAX];

int multime(int x)
{
	while(x!=p[x])
		x=p[x];
	return x;
}

void reuneste(int x, int y, int cost)
{
	x=multime(x);
	y=multime(y);
	if(rang[x]<rang[y]) {
		p[x]=y;
		c[x]=cost;
	}
	else {
		p[y]=x;
		c[y]=cost;
	}
	if(rang[x]==rang[y])
		rang[x]++;
}

int maxim(int x)
{
	int maxx;
	maxx=0;
	while(x!=p[x]) {
		maxx=max(maxx,c[x]);
		x=p[x];
	}
	return maxx;
}

int main ()
{
	int i,k,nrk,n,m,x,y,cost;
	ifstream f("radiatie.in");
	ofstream g("radiatie.out");
	f>>n>>m>>nrk;
	for(i=1;i<=n;i++) {
		f>>x>>y>>cost;
		v.pb ( mp ( cost , mp ( x , y ) ) );
	}		
	for(i=1;i<=n;i++) {
		p[i]=i;
		rang[i]=1;
	}
	sort(v.begin(),v.end());
	for(i=0,k=0;i<=m-1 && k<=n-1;i++)
		if(multime(v[i].y.x)!=multime(v[i].y.y)) {
			reuneste(v[i].y.x,v[i].y.y,v[i].x);
			k++;
		}
	f.close();
	g.close();
	return 0;
}