【祖孙询问】

问题

代码

#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根本不是一个正常值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值