Cod sursa(job #535388)

Utilizator jeanFMI - Petcu Ion Cristian jean Data 17 februarie 2011 10:05:49
Problema Radiatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include<stdio.h>
#include<algorithm>
#define Nmax 15010
#define Mmax 30010
using namespace std;

struct muchie { int x,y,c ; } M[Mmax];

int T[Nmax],viz[Nmax],H[Nmax], Max[Nmax], TT[Nmax], C[Nmax] ;
int n,i,m,cnt,sol,k,x,y ;


int find ( int x ) 
{
	for( ; x != T[x] ; x = T[x] ) ; 
	return x ;
}

void uneste ( int x, int y )
{
	if( H[x] >= H[y] ) T[y] = x ;
	else 			   T[x] = y ;
	
	if( H[x] == H[y] ) H[x]++;
}


int cmp ( muchie a, muchie b )
{
	return a.c < b.c ; 
}

int main()
{
	freopen("radiatie.in","r",stdin);
	freopen("radiatie.out","w",stdout);
	
	scanf("%d %d %d",&n,&m,&k);
	
	for( i = 1 ; i <= m ; i++ )
		scanf("%d %d %d",&M[i].x,&M[i].y,&M[i].c);
	
	for( i = 1 ; i <= n ; i++ )
		TT[i] = T[i] = i ; 
	
	sort(M+1,M+m+1,cmp);
	
	for( i = 1 ; i <= m ; i++ )
	{
		x = find(M[i].x) ; 
		y = find(M[i].y) ; 
		
		if( x != y )
		{
			uneste(x,y);
			TT[M[i].y] = M[i].x;
			C[M[i].y] = M[i].c;
		}
	}
	
	for( i = 1 ; i <= k ; i++ )
	{
		scanf("%d %d",&x,&y);
		
		sol = 0 ; 
		
		viz[x] = i ;
		Max[x] = 0 ;
		
		for( ; x != TT[x] ; x = TT[x] ) 
		{
			viz[TT[x]] = i ; 
			if( Max[x] > C[x] ) 
				Max[TT[x]] = Max[x] ; 
			else Max[TT[x]] = C[x] ; 
		}
		
		for( ; viz[y] != i ; y = TT[y] ) 
			if( sol < C[y] ) sol = C[y] ; 
		
		if( sol < Max[y] ) sol = Max[y];
		
		printf("%d\n",sol);
	}
	
	return 0;
}