Pagini recente » Cod sursa (job #217654) | Cod sursa (job #1045523) | Cod sursa (job #2353677) | Cod sursa (job #912221) | Cod sursa (job #1005387)
#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;
}