LCA一直输出0求助
查看原帖
LCA一直输出0求助
320697
AMIRIOX無暝楼主2021/2/9 16:30

rt,code:

#include <cstdio>
#include <iostream>
using namespace std;
const int maxn = 5e5 + 20;
struct edge {
    int to, nxt;
} g[maxn << 1];
int tot, head[maxn];
void add(int u, int to) {
    g[++tot].to = to;
    g[tot].nxt = head[u];
    head[u] = tot;
}
int logs[maxn];
void logo() {
    logs[1] = 0;
    logs[2] = 1;
    for (int i = 1; i <= maxn; i++) {
        logs[i] = logs[i / 2] + 1;
    }
}
int n, y, s;
int depth[maxn], fa[maxn][22];
void dfs(int fath, int now) {
    fa[now][0] = fath;
    depth[now] = depth[fath] + 1;
    for (int i = 1; i <= logs[depth[now]]; i++) {
        fa[now][i] = fa[fa[now][i - 1]][i - 1];
    }
    for (int i = head[now]; i; i = g[i].nxt) {
        if (g[i].to != fath)
            dfs(now, g[i].to);
    }
}
int LCA(int x, int y) {
    if (depth[x] < depth[y])
        swap(x, y);
    // cout << "...." << endl;
    while (depth[x] > depth[y])
        x = fa[x][logs[depth[x] - depth[y]]];  //, printf("%d\n", x);
    // cout << "...." << endl;
    if (x == y)
        return x;
    for (int k = logs[depth[x]]; k >= 0; k--) {
        if (fa[x][k] != fa[y][k]) {
            x = fa[x][k];
            y = fa[y][k];
        }
    }
    // cout << "...." << endl;

    return fa[x][0];
}
int main() {
    scanf("%d %d %d", &n, &y, &s);
    int m = n - 1;
    for (int i = 1; i <= m; i++) {
        int x, y;
        scanf("%d %d", &x, &y);
        add(x, y);
        add(y, x);
    }
    // cout << "input ok" << endl;
    logo();
    dfs(s, 0);
    // cout << "pre process ok" << endl;
    for (int i = 1; i <= y; i++) {
        int x, y;
        scanf("%d %d", &x, &y);
        // cout << "????" << endl;
        // cout << x << y << endl;
        printf("%d\n", LCA(x, y));
        // cout << "!!!!" << endl;
    }
    return 0;
}
2021/2/9 16:30
加载中...