Pagini recente » Cod sursa (job #2429543) | Cod sursa (job #2600149) | Cod sursa (job #2825066) | Cod sursa (job #1295593) | Cod sursa (job #2544005)
#include <bits/stdc++.h>
#define Nmax 30005
using namespace std;
ifstream f("radiatie.in");
ofstream g("radiatie.out");
int N, M, Q;
vector<int> G[Nmax];
int r[Nmax], h[Nmax], nr[Nmax], lev[Nmax], dad[Nmax], val[Nmax];
struct edge{
int x, y, c;
};
edge v[Nmax];
bool cmp(edge a, edge b) {
return a.c < b.c;
}
int root(int curr) {
while (r[curr]) curr = r[curr];
return curr;
}
bool vis[Nmax];
void DFS(int node, int father) {
vis[node] = 1;
lev[node] = lev[father] + 1;
dad[node] = father;
for (auto it: G[node])
if (!vis[it]) DFS(it, node);
}
int lca(int x, int y) {
int a = lev[x], b = lev[y], ans = 0;
while (a > b)
ans = max(ans, val[x]), x = dad[x], --a;
while (b > a)
ans = max(ans, val[y]), y = dad[y], --b;
while (x != y) {
ans = max(ans, max(val[x], val[y]));
x = dad[x];
y = dad[y];
}
return ans;
}
int main()
{
f >> N >> M >> Q;
for (int i = 1; i <= M; ++i)
f >> v[i].x >>v[i].y >> v[i].c;
sort(v + 1, v + M + 1, cmp);
for (int i = 1; i <= N; ++i)
nr[i] = 1;
for (int i = 1; i <= M; ++i) {
int rx = root(v[i].x), ry = root(v[i].y);
if (rx != ry) {
val[v[i].y] = v[i].c;
G[v[i].x].push_back(v[i].y);
G[v[i].y].push_back(v[i].x);
if (h[rx] >= h[ry]) r[ry] = rx, nr[ry] += nr[rx];
else r[rx] = ry, nr[rx] += nr[ry];
if (h[rx] == h[ry]) ++h[rx];
}
}
DFS(1, 0);
for (int q = 1; q <= Q; ++q) {
int x, y;
f >> x >> y;
g << lca(x, y) << '\n';
}
return 0;
}