Pagini recente » Cod sursa (job #1273151) | Cod sursa (job #100360) | Cod sursa (job #2596648) | Cod sursa (job #418952) | Cod sursa (job #3353532)
#include <bits/stdc++.h>
#define DIM 15005
using namespace std;
ifstream fin("radiatie.in");
ofstream fout("radiatie.out");
int n, m, k, x, y, c;
int t[DIM], niv[DIM];
int rmq[18][DIM], maxi[18][DIM];
struct elem
{
int x, y, c;
};
elem mch[DIM * 2];
vector< pair <int, int> > v[DIM];
bool cmp(const elem& a, const elem& b)
{
return a.c < b.c;
}
int get_root(int x)
{
if(t[x] > 0) {
int y = get_root(t[x]);
t[x] = y;
return y;
}
return x;
}
void join(int x,int y,int c)
{
int rx=get_root(x), ry=get_root(y);
if(rx == ry) {
return ;
}
v[x].push_back({y,c});
v[y].push_back({x,c});
if(t[rx] > t[ry]) {
swap(rx,ry);
}
t[rx] += t[ry];
t[ry] = rx;
}
void apm()
{
sort(mch + 1,mch + m + 1, cmp);
for (int i = 1; i <= m; i++) {
join(mch[i].x, mch[i].y, mch[i].c);
}
}
void dfs(int nod,int t)
{
niv[nod] = niv[t] + 1;
rmq[0][nod] = t;
for (auto i : v[nod]) {
if (i.first != t) {
maxi[0][i.first] = i.second;
dfs(i.first,nod);
}
}
}
int lca(int x, int y)
{
int r = 0;
if (niv[x] < niv[y]) {
swap(x, y);
}
for(int i = 17;i >= 0 && niv[x] > niv[y]; i--) {
if (rmq[i][x] !=0 && niv[rmq[i][x]] >= niv[y]) {
r = max(r, maxi[i][x]);
x = rmq[i][x];
}
}
for(int i = 17; i>=0; i--) {
if (rmq[i][x] != 0 && rmq[i][y] != 0 && rmq[i][x] != rmq[i][y]){
r = max(r, max(maxi[i][y], maxi[i][x]));
x = rmq[i][x];
y = rmq[i][y];
}
}
if (x != y) {
r = max(r, max(maxi[0][x], maxi[0][y]));
}
return r;
}
int main()
{
fin >> n >> m >> k;
for(int i = 1; i <= n; i++) {
t[i] = -1;
}
for(int i = 1; i <= m; i++) {
fin >> mch[i].x >> mch[i].y >> mch[i].c;
}
apm();
dfs(1, 0);
for (int i = 1; (1 << i) <= n; i++) {
for (int j = 1; j <= n; j++){
rmq[i][j] = rmq[i - 1][rmq[i - 1][j]];
maxi[i][j] = max(maxi[i - 1][rmq[i - 1][j]],maxi[i - 1][j]);
}
}
while(k--) {
fin >> x >> y;
fout << lca(x,y) << '\n';
}
return 0;
}