#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e4 + 7;
int n, deg[N], root;
vector<int> G[N];
int dep[N], par[N][20];
void dfs(int u, int fa) {
dep[u] = dep[fa] + 1;
par[u][0] = fa;
for (int i = 1; i < 20; ++i) {
par[u][i] = par[ par[u][i - 1] ][i - 1];
}
for (int i = 0; i < G[u].size(); ++i) {
int v = G[u][i];
if (v == fa) continue;
dfs(v, u);
}
}
int lca(int u, int v) {
if (dep[u] < dep[v]) swap(u, v);
for (int i = 19; i >= 0; --i) {
if (dep[ par[u][i] ] >= dep[v]) {
u = par[u][i];
}
}
if (u == v) return u;
for (int i = 19; i >= 0; --i) {
if (par[u][i] != par[v][i]) {
u = par[u][i];
v = par[v][i];
}
}
return par[u][0];
}
int main() {
int t = 1;
scanf("%d", &t);
while (t--) {
scanf("%d", &n);
for (int i = 1; i <= n; ++i) {
G[i].clear();
deg[i] = 0;
}
int u, v;
for (int i = 1; i < n; ++i) {
scanf("%d %d", &u, &v);
G[u].push_back(v);
deg[v]++;
}
for (int i = 1; i <= n; ++i) {
if (deg[i] == 0) {
root = i;
break;
}
}
dfs(root, 0);
scanf("%d %d", &u, &v);
printf("%d\n", lca(u, v));
}
return 0;
}
2021-02-06
最新推荐文章于 2024-10-17 21:38:17 发布