倍增LCA求助
查看原帖
倍增LCA求助
134519
qwq自动机楼主2021/7/9 09:47

对着书打的,但是输出都是0

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 500010;
int depth[MAXN];
int lg2[MAXN];
int pre[MAXN][32];
int n, m;
vector<int> nxt[MAXN];
inline int power2(const int &p) { return 1 << p; }
inline int logar2(const int &p) { return lg2[p]; }
inline void preprocessing(const int &n)
{
    lg2[0] = -1;
    for (int i = 1; i <= n; i++)
    {
        lg2[i] = lg2[i / 2] + 1;
        depth[i] = 0;
    }
    queue<int> q;
    depth[s] = 1;
    q.push(s);
    while (!q.empty())
    {
        int cur = q.front();
        q.pop();
        for (int i = 0; i < nxt[cur].size(); i++)
        {
            int v = nxt[cur][i];
            if (depth[v])
                return;
            depth[v] = depth[cur] + 1;
            pre[v][0] = cur;
            for (int j = 1; j <= logar2(n) + 1; j++)
                pre[v][j] = pre[pre[v][j - 1]][j - 1];
            q.push(v);
        }
    }
}
int query(int x, int y, int n)
{
    if (depth[x] < depth[y])
        return query(y, x, n);
    int k = logar2(n) + 1;
    for (int i = k; i >= 0; i--)
        if (depth[pre[x][i]] >= depth[y])
            x = pre[x][i];
    if (x == y)
        return x;
    for (int i = k; i >= 0; i--)
        if (pre[x][i] != pre[y][i])
        {
            x = pre[x][i];
            y = pre[y][i];
        }
    return pre[x][0];
}
int main()
{
    scanf("%d%d", &n, &m);
    for (int i = 1, x, y; i < n; i++)
    {
        scanf("%d%d", &x, &y);
        nxt[x].push_back(y);
    }
    preprocessing(n);
    for (int i = 1, x, y; i <= m; i++)
    {
        scanf("%d%d", &x, &y);
        printf("%d\n", query(x, y, n));
    }
    return 0;
}
2021/7/9 09:47
加载中...