Pagini recente » Cod sursa (job #250630) | Cod sursa (job #167086) | Cod sursa (job #2522505) | Cod sursa (job #1692475) | Cod sursa (job #3171586)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
ifstream fin ( "radiatie.in" );
ofstream fout ( "radiatie.out" );
const int N = 5e4;
int str[N], niv[N];
struct muchie {
int a;
int b;
int cost;
} v[N];
vector <pair <int, int>> g[N];
bool cmp ( muchie a, muchie b ) {
return a.cost < b.cost;
}
int sup[N];
int suprem ( int x ) {
if ( x == sup[x] )
return x;
else {
sup[x] = suprem(sup[x]);
return sup[x];
}
}
int viz[N], dist[N], rad[N];
void dfs ( int node, int par ) {
str[node] = par;
niv[node] = niv[par] + 1;
for ( int i = 0; i < g[node].size(); i++ )
if ( g[node][i].first != par ) {
rad[g[node][i].first] = g[node][i].second;
dfs ( g[node][i].first, node );
}
}
int lca ( int x, int y ) {
int ans = 0;
if ( niv[x] < niv[y] )
swap ( x, y );
while ( niv[x] > niv[y] ) {
ans = max ( ans, rad[x] );
x = str[x];
}
while ( x != y ) {
ans = max ( ans, max ( rad[x], rad[y]) );
x = str[x];
y = str[y];
}
return ans;
}
int main () {
int n, m, q;
fin >> n >> m >> q;
for ( int i = 0; i < m; i++ )
fin >> v[i].a >> v[i].b >> v[i].cost;
sort ( v, v + n, cmp );
for ( int i = 1; i <= n; i++ )
sup[i] = i;
for ( int i = 0; i < m; i++ ) {
if ( suprem (v[i].a) != suprem(v[i].b) ) {
sup[suprem(v[i].a)] = suprem(v[i].b);
g[v[i].a].push_back ( {v[i].b, v[i].cost} );
g[v[i].b].push_back ( {v[i].a, v[i].cost} );
}
}
dfs ( 1, 0 );
int x, y;
for ( int i = 0; i < q; i++ ) {
fin >> x >> y;
fout << lca ( x, y ) << "\n";
}
return 0;
}