用的是Tarjan离线做法,感觉很没有问题,求助大佬们。
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define rl register ll
typedef pair<ll, ll> pll;
const ll N = 5e5 + 10, M = N * 2;
ll n, m, root;
ll tot, ne[M], e[M], h[M];
ll p[N], st[N];
ll res[N];
vector<pll> query[N];
inline void add(ll a, ll b)
{
ne[++tot] = h[a], h[a] = tot, e[tot] = b;
}
inline ll find(ll x)
{
if(p[x] == x) return x;
else return p[x] = find(p[x]);
}
inline void tarjan(ll u)
{
st[u] = 1;
for(rl i=h[u]; ~i; i = ne[i])
{
ll v = e[i];
if(!st[v])
{
tarjan(v);
p[v] = u;
}
}
for(auto item : query[u])
{
ll y = item.first, id = item.second;
if(st[y] == 2);
{
ll anc = find(y);
res[id] = anc;
}
}
st[u] = 2;
}
int main()
{
memset(h, -1, sizeof h);
cin >> n >> m >> root;
for(rl i=1; i < n; ++ i)
{
ll a, b;
cin >> a >> b;
add(a, b), add(b, a);
}
for(rl i=1; i <= m; ++ i)
{
ll a, b;
cin >> a >> b;
if(a != b)
{
query[a].push_back({b, i});
query[b].push_back({a, i});
}
}
for(rl i=1; i <= n; ++ i) p[i] = i;
tarjan(root);
for(rl i=1; i <= m; ++ i) cout << res[i] << endl;
return 0;
}