Cod sursa(job #535397)

Utilizator jeanFMI - Petcu Ion Cristian jean Data 17 februarie 2011 10:15:16
Problema Radiatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 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],H[Nmax],TT[Nmax],C[Nmax],nivel[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;
			nivel[M[i].y] = nivel[M[i].x] + 1 ;
		}
	}
	
	for( i = 1 ; i <= k ; i++ )
	{
		scanf("%d %d",&x,&y);
		
		sol = 0 ; 
		
		while( x != y ) 
		{
			if( nivel[x] > nivel[y] )
			{
				if( sol < C[x] ) sol = C[x] ;
				x = TT[x] ;
			}
			else 
			{
				if( sol < C[y] ) sol = C[y] ;
				y = TT[y] ; 
			}
		}
		
		printf("%d\n",sol);
	}
	
	return 0;
}