rt
在样例中输出第2 3行会爆0(输出:4 0 0 4 4)
初步判断为lca()问题,但是找不到
求大佬帮调
代码如下:
#include<bits/stdc++.h>
using namespace std;
const int N = 5e5+5;
struct node{
int to,nxt;
} e[N];
int head[N], cnt;
int deep[N], fa[N][19], lg[N];
void add(int u, int v){
e[++cnt].nxt = head[u];
head[u] = cnt;
e[cnt].to = v;
}
//void lgg(int n){ for(int i = 1; i <= n; ++i) lg[i] = lg[i - 1] + (1 << log[i-1] == i);}
void dfs(int now, int fath){
deep[now] = deep[fath] + 1;
fa[now][0] = fath;
for(int i = 1; i <= 19; ++i) fa[now][i] = fa[fa[now][i - 1]][i - 1];
for(int i = head[now]; i; i = e[i].nxt) if(e[i].to != fath) dfs(e[i].to, now);
}
int lca(int a, int b){
if(deep[a] < deep[b]) swap(a, b);
int i = deep[a] - deep[b], j = 0;
//printf("%d %d\n", deep[a], deep[b]);
while(i){
if(i & 1) a = fa[a][j];
++j, i >>= 1;
}
//printf("%d %d %d %d\n", a, b, deep[a], deep[b]);
if(a == b) return a;
i = 19;
while(i-- && a != b) if(fa[a][i] != fa[b][i]) a = fa[a][i], b = fa[b][i];
return fa[a][0];
}
int n, m, u, v, s;
int main(){
scanf("%d %d %d", &n, &m, &s);
for(int i = 1; i <= n - 1; ++i) scanf("%d %d", &u, &v), add(u, v), add(v, u);
dfs(s, 0);
for(int i = 1; i <= m; ++i) scanf("%d %d", &u, &v), printf("%d\n", lca(u, v));
return 0;
}