Cod sursa(job #911218)

Utilizator ELHoriaHoria Cretescu ELHoria Data 11 martie 2013 14:02:28
Problema Radiatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <fstream>
#include <vector>
#include <cstring>
#include <queue>
#include <algorithm>
#define pii pair<int,int>
#define x first
#define y second
#define mp make_pair

using namespace std;

ifstream cin("radiatie.in");
ofstream cout("radiatie.out");

const int NMAX = 15002;
int N, M, K;
pair<int,pii> E[NMAX<<1];
int T[NMAX], cost[NMAX], rang[NMAX], lvl[NMAX];

void readData() {
	cin>>N>>M>>K;
	for(int i = 0;i < M;i++) {
		cin>>E[i].y.x>>E[i].y.y>>E[i].x;
	}
}

int getRoot(int v) {
	for(;v != T[v];v = T[v]);
	return v;
}

int getLvl(int v) {
	if(T[v] == v) return lvl[v] = 1;
	if(lvl[v] != 0) {
		return lvl[v];
	}
	return lvl[v] = 1 + getLvl(T[v]);
}

int main()
{
	readData();
	sort(E,E + M);
	for(int i = 1;i <= N;i++) {
		T[i] = i;
	}

	for(int i = 0, e = 0;e < N - 1;i++) {
		int ra = getRoot(E[i].y.x);
		int rb = getRoot(E[i].y.y);
		if(ra != rb) {
			e++;
			if(rang[ra] < rang[rb]) {
				T[ra] = rb;
				cost[ra] = E[i].x;
				rang[rb]++;
			} else {
				T[rb] = ra;
				cost[rb] = E[i].x;
				rang[ra]++;
			}
		}
	}
	for(int i = 1;i <= N;i++) {
		if(!lvl[i]) {
			lvl[i] = getLvl(i);
		}
	}
	int a, b;
	for(int i = 0;i < K;i++) {
		cin>>a>>b;
		int r = 0;
		while(a != b) {
			if(lvl[a] > lvl[b]) {
				r = max(r,cost[a]);
				a = T[a];
			} else {
				r = max(r,cost[b]);
				b = T[b];
			}
		}
		cout<<r<<"\n";
	}
	return 0;
}