Cod sursa(job #384942)

Utilizator swift90Ionut Bogdanescu swift90 Data 21 ianuarie 2010 20:41:29
Problema Radiatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 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],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(tt[x]==x){
		dp[x]=1;
		return;
	}
	df(tt[x]);
	dp[x]=dp[tt[x]]+1;
}
void apm(){
	int i,x,y,a,b;
	for(i=0;i<m;++i){
		x=nr[i].sc.fs;
		y=nr[i].sc.sc;
		a=tata(x);
		b=tata(y);
		if(a!=b){
			if(tt[y]==y){
				tt[y]=x;
				cost[y]=nr[i].fs;
			}
			else{
				tt[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];b=tt[b])
		s=max(s,cost[b]);
	for(;a!=b;a=tt[a],b=tt[b])
		s=max(s,max(cost[a],cost[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)
		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;
}