问题
代码
#include <bits/stdc++.h>
using namespace std;
const int N = 4e4+10;
vector<int> edge[N];
int p[N][20], d[N];
void dfs(int from, int u)
{
for(auto to : edge[u])
{
if(to == from) continue;
d[to] = d[u] + 1;
p[to][0] = u;
dfs(u, to);
}
}
void init()
{
for(int i = 1; i <= 18; i++)
{
for(int j = 1; j <= 4e4; j++)
{
p[j][i] = p[p[j][i-1]][i-1];
}
}
}
int lca(int x, int y)
{
if(x == y) return 0;
for(int i = 18; i >= 0; i--)
{
if(d[p[x][i]] >= d[y]) x = p[x][i];
}
if(x == y) return 2;
for(int i = 18; i >= 0; i--)
{
if(d[p[y][i]] >= d[x]) y = p[y][i];
}
if(x == y) return 1;
return 0;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n, root;
cin >> n;
for(int i = 1; i <= n; i++)
{
int a, b;
cin >> a >> b;
if(b == -1) root = a;
else
{
edge[a].push_back(b);
edge[b].push_back(a);
}
}
d[root] = 1;
dfs(0, root);
init();
int m;
cin >> m;
for(int i = 1; i <= m; i++)
{
int a, b;
cin >> a >> b;
cout << lca(a, b) << '\n';
}
return 0;
}
遇到的问题
init的时候用N来循环,越界了,但是看起来是d变了
根节点一开始默认为0,但是发现在样例中234,233的lca不对,发现:本意是想让233的深度减小到和234一样就退出,结果因为d默认值是0,深度直接变为0,此时i=18,p根本不是一个正常值。