Cod sursa(job #1005387)

Utilizator superman_01Avramescu Cristian superman_01 Data 4 octombrie 2013 23:17:33
Problema Radiatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.22 kb
#include <fstream>
#include <vector>
#include <algorithm>
  
#define INF 0x3f3f3f
#define MAX_SIZE 30005
#define QMAX 15005
#define SZ 3500000
#define get_max (a,b) ((a) > (b) ? (a) : (b))
  
using namespace std;
  
ifstream in ( "radiatie.in" );
ofstream out ( "radiatie.out" );
  
struct Edge {
   int x , y , c;
     inline bool operator() ( const Edge &a , const Edge &b ){
     return a.c < b. c ;
     }
};
  
int TT[MAX_SIZE] , RG[MAX_SIZE];
Edge E[MAX_SIZE];
int N , M, Answer , Q ;
int Cost[MAX_SIZE];
int col[MAX_SIZE];

 
char input[SZ],*ini=input;
   
inline int atoi()
{
    int nr=0;
    for(;!(*ini>='0' && *ini<='9');++ini);
    for(;*ini>='0' && *ini<='9';++ini)
        nr=nr*10+(*ini-'0');
    return nr;
}
  
inline int Find ( int x )
{
    int R ;
    for( R= TT[x] ; R!= TT[R] ; R= TT[R] );
    return R;
}
void Unite(int x, int y , int cost )
{
    if (RG[x] > RG[y])
      {
		  TT[y] = x;
		  Cost[y] = cost ;
	}
            else
      {				
		  TT[x] = y;
		  Cost[x] = cost;
		}
    if (RG[x] == RG[y]) RG[y]++;
}
void MakeKruskal ( void )
{
	int i ;
	for ( i = 1 ; i <= N ; TT[i] = i ,RG[i] = 1 , ++i ) ;
    sort ( E +1 , E+ M + 1 , Edge() ) ;
    for ( i = 1 ; i <= M ; ++i )
    {
       int x = Find( E[i].x ) , y = Find( E[i].y) ;
       if ( x != y )
            Unite ( x ,  y  , E[i].c ) ;
    }
}

int FindLCA ( int a , int b , int value )
{
	for ( ; a != TT[a] ; col[a] = value ,a = TT[a] );
	for ( ; b != TT[b] && col[b] != value ; b = TT[b] );
	return b;
}

int main ( void )
{
    int i , j  , x , y , lca ;
    in.read(input, SZ);
    N = atoi();
    M = atoi() ;
    Q = atoi();
    for ( i = 1 ; i <= M ; ++i )
       { 
           E[i].x = atoi();
           E[i].y = atoi();
           E[i].c = atoi();
    }
	MakeKruskal();
	for ( i = 1 ; i <= Q ; ++i )
	{
		x = atoi() ; 
		y = atoi() ;
		lca = FindLCA ( x , y , i ) ;
		int Answer  = -INF;
		for ( ; x != lca ; x = TT[x] )
			Answer = max ( Answer , Cost[x] );
		for ( ; y != lca ; y = TT[x] )
			Answer = max ( Answer , Cost[y] );
		Answer = max ( Answer , Cost[lca] );
		out << Answer << "\n";
	}
	
    in.close();
    out.close();
    return 0;
      
      
}