Pagini recente » Cod sursa (job #2114996) | Cod sursa (job #2080957) | Cod sursa (job #2033322) | Cod sursa (job #126727) | Cod sursa (job #3307413)
#include <bits/stdc++.h>
using namespace std;
struct edge {
int u, v, cost;
bool operator <(const edge& other) const {
return cost < other.cost;
}
}e[30005];
int anc[15005][17], rmq[15005][17], siz[15005], lead[15005], depth[15005];
bool viz[15005];
vector<pair<int, int>> adj[15005];
int find(int u) {
if (u == lead[u]) return u;
return lead[u] = find(lead[u]);
}
void unite(int u, int v) {
if (siz[u] > siz[v]) swap(u, v);
lead[u] = v;
siz[u] += siz[v];
}
void dfs(int u, int par, int cost) {
viz[u] = true;
depth[u] = depth[par] + 1;
anc[u][0] = par;
if (par != 0) rmq[u][0] = cost;
for (auto [v, c] : adj[u]) {
if (v == par) continue;
dfs(v, u, c);
}
}
int solve(int u, int v) {
if (depth[u] < depth[v]) swap(u, v);
int dif = depth[u] - depth[v], ans = 0;
while (dif) {
int b = 31 - __builtin_clz(dif);
ans = max(ans, rmq[u][b]);
u = anc[u][b];
dif -= 1 << b;
}
if (u == v)
return ans;
for (int b = 16; b >= 0; b--) {
if (anc[u][b] != anc[v][b]) {
ans = max(ans, rmq[u][b]);
ans = max(ans, rmq[v][b]);
u = anc[u][b];
v = anc[v][b];
}
}
ans = max(ans, rmq[u][0]);
ans = max(ans, rmq[v][0]);
return ans;
}
int main() {
ifstream cin("radiatie.in");
ofstream cout("radiatie.out");
int n, m, q;
cin >> n >> m >> q;
for (int i = 1; i <= n; i++) {
siz[i] = 1;
lead[i] = i;
}
for (int i = 1; i <= m; i++) {
cin >> e[i].u >> e[i].v >> e[i].cost;
}
sort(e + 1, e + m + 1);
for (int i = 1; i <= m; i++) {
int uu = find(e[i].u);
int vv = find(e[i].v);
if (uu == vv) continue;
unite(uu, vv);
adj[e[i].u].push_back({e[i].v, e[i].cost});
adj[e[i].v].push_back({e[i].u, e[i].cost});
}
for (int i = 1; i <= n; i++) {
if (viz[i] == false) {
dfs(i, 0, 0);
}
}
for (int b = 1; b < 17; b++) {
for (int i = 1; i <= n; i++) {
anc[i][b] = anc[anc[i][b - 1]][b - 1];
rmq[i][b] = max(rmq[i][b - 1], rmq[anc[i][b - 1]][b - 1]);
}
}
while (q--) {
int x, y;
cin >> x >> y;
cout << solve(x, y) << '\n';
}
return 0;
}