Pagini recente » Cod sursa (job #1184596) | Cod sursa (job #1934332) | Cod sursa (job #581998) | Cod sursa (job #2506036) | Cod sursa (job #2904834)
#include <bits/stdc++.h>
using namespace std;
struct edge {
int a, b, c;
};
int t[15005], Rank[15005];
int depth[15005];
int anc[15005][16];
int len[15005][16];
vector < pair < int, int > > graph[15005];
int root(int k) {
if(t[k] == 0)
return k;
else {
int x = root(t[k]);
t[k] = x;
return x;
}
}
void Union(int u, int v, int c) {
int root_u = root(u), root_v = root(v);
if(root_u != root_v) {
graph[u].push_back({v, c});
graph[v].push_back({u, c});
if(Rank[root_u] > Rank[root_v]) {
Rank[root_u] += Rank[root_v];
Rank[root_v] = 0;
t[root_v] = root_u;
}
else {
Rank[root_v] += Rank[root_u];
Rank[root_u] = 0;
t[root_u] = root_v;
}
}
}
void dfs(int k, int dad) {
for(pair < int, int > x : graph[k]) {
if(x.first == dad)
continue;
anc[x.first][0] = k;
len[x.first][0] = x.second;
depth[x.first] = depth[k] + 1;
for(int i = 1; i <= 14; i++) {
anc[x.first][i] = anc[anc[x.first][i - 1]][i - 1];
len[x.first][i] = max(len[x.first][i - 1], len[anc[x.first][i - 1]][i - 1]);
}
dfs(x.first, k);
}
}
int lca(int a, int b) {
int best = 0;
if(depth[a] < depth[b])
swap(a, b);
int k = depth[a] - depth[b];
for(int i = 0; i <= 14; i++) {
if(k & (1 << i)) {
best = max(best, len[a][i]);
a = anc[a][i];
}
}
if(a == b)
return best;
for(int i = 14; i >= 0; i--) {
if(anc[a][i] != anc[b][i]) {
best = max(best, max(len[a][i], len[b][i]));
a = anc[a][i];
b = anc[b][i];
}
}
best = max(best, max(len[a][0], len[b][0]));
return best;
}
bool cmp(const edge x, const edge y) {
return x.c < y.c;
}
int n, m, k;
edge e[30005];
int main()
{
freopen("radiatie.in", "r", stdin);
freopen("radiatie.out", "w", stdout);
scanf("%d%d%d", &n, &m, &k);
for(int i = 1; i <= m; i++) {
scanf("%d%d%d", &e[i].a, &e[i].b, &e[i].c);
}
sort(e + 1, e + m + 1, cmp);
for(int i = 1; i <= m; i++) {
Union(e[i].a, e[i].b, e[i].c);
}
for(int i = 0; i <= 14; i++)
anc[1][i] = 1;
dfs(1, 0);
while(k--) {
int u, v;
scanf("%d%d", &u, &v);
printf("%d\n", lca(u, v));
}
return 0;
}