在线LCA
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
const int MAX = 10005;
const int INF = 0x3f3f3f;
int depth[MAX], fa[MAX], flag[MAX];
vector<int> tree[MAX];
void file()
{
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
}
void dfs(int v, int p = -1, int d = 0)
{
fa[v] = p;
depth[v] = d;
int lenth = tree[v].size();
for (int i = 0; i < lenth; ++i)
{
if (tree[v][i] != p)
dfs(tree[v][i], v, d + 1);
}
}
int lca(int a, int b)
{
// printf("%d depth = %d, %d depth = %d\n", a, depth[a], b, depth[b]);
while (depth[a] > depth[b])
{
a = fa[a];
}
// printf("%d depth = %d, %d depth = %d\n", a, depth[a], b, depth[b]);
while (depth[a] < depth[b])
{
b = fa[b];
}
// printf("a = %d, b = %d\n", a, b);
while (a != b)
{
a = fa[a];
b = fa[b];
}
return a;
}
int main()
{
int t;
//file();
scanf("%d", &t);
while (t--)
{
int n;
scanf("%d", &n);
for (int i = 1; i <= n; ++i)
{
tree[i].clear();
}
memset(fa, -1, sizeof(fa));
memset(depth, 0, sizeof(depth));
memset(flag, 0, sizeof(flag));
int a, b;
for (int i = 1; i <= n - 1; ++i)
{
scanf("%d%d", &a, &b);
tree[a].push_back(b);
flag[b] = 1;
}
for (int i = 1; i <= n; ++i)
{
if (!flag[i])
{
dfs(i);
break;
}
}
int q_a, q_b;
scanf("%d%d", &q_a, &q_b);
// printf("depth of q_a and q_b: %d %d\n", depth[q_a], depth[q_b]);
printf("%d\n", lca(q_a, q_b));
}
return 0;
}