Pagini recente » Cod sursa (job #2339911) | Cod sursa (job #2568507) | Cod sursa (job #1237639) | Cod sursa (job #2283537) | Cod sursa (job #1005391)
#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[x] )
Answer = max ( Answer , Cost[y] );
Answer = max ( Answer , Cost[lca] );
out << Answer << "\n";
}
in.close();
out.close();
return 0;
}