Cod sursa(job #811529)

Utilizator SebiSebiPirtoaca George Sebastian SebiSebi Data 12 noiembrie 2012 16:18:41
Problema Radiatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 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],viz[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 lca(int x, int y, int nr)
{
	viz[x]=nr;
	while(x!=p[x]) {
		viz[p[x]]=nr;
		x=p[x];
	}
	while(y!=p[y] && viz[y]!=nr)
		y=p[y];
	return y;
}

int maxim(int x, int y, int nr)
{
	int maxx,r;
	r=lca(x,y,nr);
	maxx=0;
	while(x!=r) {
		maxx=max(maxx,c[x]);
		x=p[x];
	}
	while(y!=r) {
		maxx=max(maxx,c[y]);
		y=p[y];
	}
	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++;
		}
	for(i=1;i<=nrk;i++) {
		f>>x>>y;
		g<<maxim(x,y,i)<<'\n';
	}
	f.close();
	g.close();
	return 0;
}