Cod sursa(job #221492)

Utilizator andrei-alphaAndrei-Bogdan Antonescu andrei-alpha Data 16 noiembrie 2008 17:40:51
Problema Radiatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.72 kb
using namespace std;

#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <vector>
#include <string>
#include <bitset>
#include <algorithm>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <stack>
#include <queue>
#include <utility>
#include <functional>

#define pb push_back
#define c first
#define n second
#define f n.first
#define s n.second
#define sz size
#define II inline
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define mp make_pair

#define IN  "radiatie.in"
#define OUT "radiatie.out"
#define oo 1<<30
#define N_MAX 1<<14

typedef pair<int,int> pi;
typedef vector<int> VI;
vector< pair<int,pi> > V;

int H[N_MAX],C[N_MAX],NR[N_MAX],T[N_MAX];
int R,N,M,K;

II void scan()
{
	int x,y,cc;
	freopen(IN,"r",stdin);
	freopen(OUT,"w",stdout);
	scanf("%d%d%d\n",&N,&M,&K);
	FOR(i,1,M)
	{
		scanf("%d%d%d\n",&x,&y,&cc);
		V.pb( mp(cc, mp(x,y) ) );
		NR[x] = NR[y] = 1;
	}	
	sort(V.begin(),V.end());
}

II int rep(int x)
{
	return (!T[x]?x:rep(T[x]) );
}

II void add(int i,int x,int y)
{
	if(NR[y] > NR[x])
		NR[y] += NR[x],
		C[x] = V[i].c,
		T[x] = y;
	else
		NR[x] += NR[y],
		C[y] = V[i].c,
		T[y] = x;
}

II void make_tree()
{
	int R1,R2;
	FOR(i,0,M-1)
	{
		R1 = rep(V[i].f);
		R2 = rep(V[i].s);
		if(R1^R2)
			add(i,R1,R2);
	}	
}


II int querry(int x,int y)
{
	int rez(0);
	if(H[y] > H[x])
		swap(x,y);
	for(;H[x] > H[y];rez = max(rez,C[x]),x = T[x]);
	for(;x != y;rez = max(rez, max(C[y],C[x]) ),y = T[y],x = T[x]);
	return rez;
}

  
II void solve()
{
	R = rep(1);
	
	FOR(i,1,N)
		for(int j=i;j^R;++H[i],j=T[j]);
	
	int x,y;
	FOR(i,1,K)
		scanf("%d %d\n",&x,&y),
		printf("%d\n",querry(x,y) );
}


int main()
{
	scan();
	make_tree();
	solve();
	return 0;
}