Cod sursa(job #22741)

Utilizator azotlichidAdrian Vladu azotlichid Data 27 februarie 2007 11:29:17
Problema Radiatie Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.64 kb
#include <algorithm>
#include <iostream>
#include <iterator>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <string>
#include <vector>

#include <cassert>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cctype>
#include <cstring>

#define ALL(x) (x).begin(), (x).end()
#define CLEAR(X) (memset(X, 0, sizeof(X)))
#define FORI(it, x) for (__typeof((x).begin()) it = (x).begin(); it != (x).end(); ++it)
#define FOR(i, N, M) for (int i = (int)(N); i <= (int)(M); ++i)
#define REP(i, N) for (int i = 0; i < (int)(N); ++i)
#define SIZE(X) (int)((X).size())
#define TIPA(a, i) (cerr << #a << "[" #i " = " << (i) << "] = " << (a)[i] << endl)
#define TIP(x) (cerr << #x << " = " << (x) << endl)

#define MP make_pair
#define PB push_back
#define INF 0x3f3f3f3f

typedef long long LL;

using namespace std;

#define NMAX 15005
#define LMAX 16

int N, M, K;
vector<pair<int, pair<int, int> > >E;
vector<pair<int, int> > adj[NMAX];
int pi[NMAX], u[NMAX], lev[NMAX];

int p[LMAX][NMAX], m[LMAX][NMAX];

int getset(int x) 
{
	return pi[x] == x ? x : x = pi[x];
}

int join(int x, int y)
{
	if ((x = getset(x)) != (y = getset(y)))
		pi[x] = y;
}

void dfs(int x, int l)
{
	u[x] = 1, lev[x] = l;

	int anc;
	FOR(i, 1, 14)
		if (anc = p[i-1][x])
		{
			p[i][x] = p[i-1][anc];
			m[i][x] = max(m[i-1][x], m[i-1][anc]);
		}

	FORI(it, adj[x])
		if (!u[it->first])
		{
			p[0][it->first] = x, m[0][it->first] = it->second;
			dfs(it->first, l+1);
		}
}

int main(void) {
	freopen("radiatie.in", "r", stdin);
	freopen("radiatie.out", "w", stdout);

	//read
	scanf("%d %d %d", &N, &M, &K);
	REP(stp, M)
	{
		int a, b, c;
		scanf("%d %d %d", &a, &b, &c);
		E.PB(MP(c, MP(a, b)));
	}

	//APM
	sort(ALL(E));
	FOR(i, 1, N) pi[i] = i;
	
	FORI(it, E)
	{
		int a = (*it).second.first, b = (*it).second.second, c = (*it).first;
		if (getset(a) != getset(b))
		{
//			fprintf(stderr, ">> %d %d\n", a, b);
			adj[a].PB(MP(b, c)), adj[b].PB(MP(a, c));
			join(a, b);
		}
	}

	//RMQ
	CLEAR(u), CLEAR(p), memset(m, 0x3F, sizeof(m));
	dfs(1, 0);

	//score
	REP(sss, K)
	{
		int a, b, mx = -INF;
		scanf("%d %d", &a, &b);
		if (lev[a] < lev[b]) swap(a, b);
	
		for (int stp = 14; stp >= 0; stp --)
			if (lev[a] - (1<<stp) >= lev[b])
			{
				mx >?= m[stp][a];
				a = p[stp][a];
			}

		if (a != b)
		{
			for (int stp = 14; stp >= 0; stp --)
				if (p[stp][a] != p[stp][b])
				{
					mx >?= m[stp][a], mx >?= m[stp][b];
					a = p[stp][a], b = p[stp][b];
				}
				mx >?= m[0][a], mx >?= m[0][b];
		}

		printf("%d\n", mx);
	}
	return 0;
}