Cod sursa(job #384935)

Utilizator swift90Ionut Bogdanescu swift90 Data 21 ianuarie 2010 20:23:16
Problema Radiatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include<stdio.h>
#include<vector>
#include<algorithm>
using namespace std;
#define fs first
#define sc second
typedef pair <int,int> hh;
typedef pair <int, hh> gg;
vector <gg> nr;
int n,m,k;
int tt[15100],T[15100],cost[15100],dp[15100];
int tata(int x){
	if(tt[x]==x)
		return x;
	return tata(tt[x]);
}
void df(int x){
	if(dp[x])
		return;
	if(T[x]==x){
		dp[x]=1;
		return;
	}
	df(T[x]);
	dp[x]=dp[T[x]]+1;
}
void apm(){
	int i,x,y;
	for(i=0;i<m;++i){
		x=nr[i].sc.fs;
		y=nr[i].sc.sc;
		if(tata(x)!=tata(y)){
			tt[x]=y;
			T[x]=y;
			cost[x]=nr[i].fs;
		}
	}
	for(i=1;i<=n;++i){
		if(!dp[i])
			df(i);
	}
}
inline int max(int a,int b){
	return a>b?a:b;
}
int solve(int a,int b){
	int s=0,ax;
	if(dp[b]<dp[a]){
		ax=a;
		a=b;
		b=ax;
	}
	for(;dp[a]<dp[b];s=max(s,cost[b]),b=T[b]);
	for(;a!=b;s=max(s,max(cost[a],cost[b])),a=T[a],b=T[b]);
	return s;
}
int main(){
	freopen("radiatie.in","r",stdin);
	freopen("radiatie.out","w",stdout);
	int a,b,c,i;
	scanf("%d%d%d",&n,&m,&k);
	for(i=0;i<m;++i){
		scanf("%d%d%d",&a,&b,&c);
		nr.push_back(gg(c,hh(a,b)));
	}
	sort(nr.begin(),nr.end());
	for(i=1;i<=n;++i)
		T[i]=tt[i]=i;
	apm();
	
	for(i=0;i<k;++i){
		scanf("%d%d",&a,&b);
		printf("%d\n",solve(a,b));
	}
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}