Cod sursa(job #546019)

Utilizator jeanFMI - Petcu Ion Cristian jean Data 4 martie 2011 11:48:17
Problema Radiatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 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],C[Nmax],viz[Nmax],Max[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 , C[y] = M[i].c ; 
	else 			   T[x] = y , C[x] = M[i].c ; 
	
	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++ )
		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);
	}
	
	for( i = 1 ; i <= k ; i++ )
	{
		scanf("%d %d",&x,&y);
		
		sol = 0 ;
		
		cnt++;  Max[x] = 0 ;  viz[x] = cnt ; 
		
		for( ; x != T[x] ; x = T[x] ) 
		{
			if( C[x] > sol ) sol = C[x] ;
			Max[T[x]] = sol ; 
			viz[T[x]] = cnt ;
		}
		
		sol = 0 ; 
		
		for( ; viz[y] != cnt ; y = T[y] ) 
			if( C[y] > sol ) sol = C[y] ; 
		
		if( Max[y] > sol ) sol = Max[y];
		
		printf("%d\n",sol);
	}
	
	return 0;
}