Pagini recente » Cod sursa (job #643628) | Cod sursa (job #379659) | Cod sursa (job #2805074) | Cod sursa (job #809752) | Cod sursa (job #2098883)
#include<fstream>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
ifstream fin("radiatie.in");
ofstream fout("radiatie.out");
int N, M, Q, T[15005], Lca[15005][16], Rmq[15005][16], R, Niv[15005], LOG, f[15005];
vector< pair<int,int> > v[15005];
void dfs( int nod, int nr ){
Niv[nod] = nr;
for( int i = 0; i < v[nod].size(); i++ ){
if( Niv[ v[nod][i].first ] == 0 ){
Lca[ v[nod][i].first ][0] = nod;
Rmq[ v[nod][i].first ][0] = v[nod][i].second;
dfs( v[nod][i].first, nr + 1 );
}
}
return;
}
struct str{
int x, y, C;
} P[30005];
inline int cmp( const str &a, const str &b ){
return a.C < b.C;
}
int rad( int nod ){
if( T[nod] < 0 )
return nod;
return rad( T[nod] );
}
inline int LCA( int a, int b ){
if( Niv[a] > Niv[b] )
swap( a, b );
int D = Niv[b] - Niv[a];
int x = 0;
while( D != 0 ){
if( ( D & 1 ) == 1 )
b = Lca[b][x];
x++;
D >>= 1;
}
for( int i = LOG; i >= 0; i-- ){
if( Lca[a][i] != Lca[b][i] ){
a = Lca[a][i];
b = Lca[b][i];
}
}
if( a == b )
return a;
else
return Lca[a][0];
}
inline int solve( int nod, int D ){
int r = 0;
int x = 0;
while( D != 0 ){
if( ( D & 1 ) == 1 ){
r = max( r, Rmq[nod][x] );
nod = Lca[nod][x];
}
x++;
D >>= 1;
}
return r;
}
int main(){
fin >> N >> M >> Q;
for( int i = 1; i <= M; i++ )
fin >> P[i].x >> P[i].y >> P[i].C;
sort( P + 1, P + M + 1, cmp );
memset( T, -1, sizeof(T) );
for( int i = 1; i <= M; i++ ){
int a = rad( P[i].x );
int b = rad( P[i].y );
if( a == b )
continue;
if( T[a] < T[b] ){
T[a] += T[b];
T[b] = a;
}else{
T[b] += T[a];
T[a] = b;
}
f[i] = 1;
}
for( int i = 1; i <= M; i++ ){
if( f[i] == 1 ){
v[ P[i].x ].push_back( make_pair( P[i].y, P[i].C ) );
v[ P[i].y ].push_back( make_pair( P[i].x, P[i].C ) );
}
}
dfs( 1, 1 );
for( int k = 1; (1<<k) <= N; k++, LOG = k )
for( int i = 1; i <= N; i++ )
Lca[i][k] = Lca[ Lca[i][k - 1] ][k - 1];
for( int k = 1; (1<<k) <= N; k++ )
for( int i = 1; i <= N; i++ )
Rmq[i][k] = max( Rmq[i][k - 1], Rmq[ Lca[i][k - 1] ][k - 1] );
for( ; Q != 0; Q-- ){
int X, Y;
fin >> X >> Y;
int nod = LCA( X, Y );
fout << max( solve( X, Niv[X] - Niv[nod] ), solve( Y, Niv[Y] - Niv[nod] ) ) << "\n";
}
return 0;
}