Cod sursa(job #1005392)

Utilizator superman_01Avramescu Cristian superman_01 Data 4 octombrie 2013 23:33:37
Problema Radiatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.15 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 R )
{
    for( ; R!= TT[R] ; R= TT[R] );
    return R;
}
void Unite(int x, int y , int cost )
{
      if ( RG[x] < RG[y] )
	  {
        TT[x]=y;
        Cost[x]=cost;
        }
    else 
	{
        TT[y]=x;
        Cost[y]=cost;
        }
     
    if(RG[x]==RG[y])
        RG[x]++;
}
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] ; a = TT[a] )
		col[a] = value ;
	for ( ; b != TT[b] && col[b] != value ; b = TT[b] );
	return b;
}

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