蓝桥杯 小明的族谱
题意
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;
}

浙公网安备 33010602011771号