蓝桥杯 小明的族谱

题意

LCA板子

代码

#include<bits/stdc++.h>
using namespace std;

inline int read() {
    int ans = 0, f = 1;
    char ch = getchar();
    while (ch < '0' || ch > '9') {
        if (ch == '-')f = -1;
        ch = getchar();
    }
    while (ch <= '9' && ch >= '0') {
        ans = ans * 10 + ch - '0';
        ch = getchar();
    }
    return ans * f;
}
const int N = 5e5+10;
vector<int> v[N];
int dep[N],fa[N][25];
void dfs(int u,int father) {
    dep[u] =dep[father] +1;
   fa[u][0] = father;
    for (int i = 1; i<= 24; i++) {
        fa[u][i] =fa[fa[u][i-1]][i-1];
    }
    for (auto e :v[u]) {
        if (e== father) continue;
        dfs(e,u);
    }
}
int lca(int a,int b) {
    if (dep[a] < dep[b]) swap(a,b);
    for (int i = 24; i>= 0; i--) {
        if (dep[fa[a][i]] >= dep[b]) {
            a=  fa[a][i];
        }
    }
    if (a==b) return a;
    for (int i =24; i>= 0; i--) {
        if (fa[a][i] != fa[b][i]) {
            a =fa[a][i],b=fa[b][i];
        }
    }
    return fa[a][0];
}
signed main() {
    int n= read(),q=read();
    for (int i = 1; i< n; i++) {
        int a=read(),b=read();
        v[a].push_back(b);
        v[b].push_back(a);
    }
    dfs(1,0);
    while (q--) {
        int a=read(),b=read();
        cout<<lca(a,b)<<"\n";
    }

    return 0;
}
posted @ 2025-06-01 14:16  Guaninf  阅读(5)  评论(0)    收藏  举报