dalao们帮忙看看
#include <cstdio>
#include <vector>
#include <cstring>
#include <iostream>
using namespace std;
struct Query
{
int y, id;
};
const int N = 500010, M = 1000010;
int h[N], e[M], ne[M], idx;
void add(int a, int b)
{
e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
}
int n, m, root;
vector<Query> ask[N];
int v[N], fa[N];
int ans[N];
int get(int x)
{
if (x == fa[x]) return x;
return fa[x] = get(fa[x]);
}
void tarjan(int u)
{
v[u] = 1;
for (int i = h[u]; ~i; i = ne[i])
{
int j = e[i];
if (v[j]) continue;
tarjan(j);
fa[j] = u;
}
// 由于y可能是x的子树中的点,所以要先递归处理子树再处理询问
for (int i = 0; i < ask[u].size(); i ++ )
{
Query t = ask[u][i];
int y = t.y, id = t.id;
if (v[y] == 2)
ans[id] = get(y);
}
v[u] = 2;
}
int main()
{
memset(h, -1, sizeof h);
cin >> n >> m >> root;
for (int i = 0; i < n - 1; i ++ )
{
int a, b;
scanf("%d%d", &a, &b);
add(a, b);
add(b, a);
}
for (int i = 1; i <= n; i ++ ) fa[i] = i;
for (int i = 1; i <= m; i ++ )
{
int x, y;
scanf("%d%d", &x, &y);
ask[x].push_back({y, i});
ask[y].push_back({x, i});
}
tarjan(root);
for (int i = 1; i <= m; i ++ ) cout << ans[i] << endl;
return 0;
}