inline void dfs(int now,int fa){//正确
dep[now]=dep[fa]+1;
fate[now][0]=fa;
vis[now]=true;
for(register int i=head[now];i;i=nxt[i]){
int y=to[i];
if(vis[y]) continue;
dfs(y,now);
}
}
inline void dfs(int now,int fa,int depth){//错误
dsu[now]=fa;
dep[now]=depth;
vis[now]=true;
for(register int i=head[now];i;i=nxt[i]){
int y=to[i];
if(vis[y]) continue;
dfs(y,now,depth+1);
}
}
以这组数据为例、
1 2
2 4
2 3
4 5

如果用上面代码求lca(1,4)输出 0
如果用下面代码求lca(1,4)输出 1
#include<bits/stdc++.h>//下面dfs(正确)
#define int long long
using namespace std;
const int DistortedFate=543210;
inline int read(){
int f(1),x(0);
char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-1;
for(;isdigit(ch);ch=getchar()) x=(x<<1)+(x<<3)+(ch^48);
return f*x;
}
inline void write(int x){
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+'0');
return ;
}
int m,n,a[DistortedFate],k,t,dis[DistortedFate],vall[DistortedFate],dep[DistortedFate];
bool vis[DistortedFate];
char ch;
int fate[DistortedFate][23];
int head[DistortedFate<<1],nxt[DistortedFate<<1],to[DistortedFate<<1],tot;
inline void add(int x,int y){
to[++tot]=y,nxt[tot]=head[x],head[x]=tot;
return ;
}
inline void dfs(int now,int fa){
dep[now]=dep[fa]+1;
fate[now][0]=fa;
vis[now]=true;
for(register int i=head[now];i;i=nxt[i]){
int y=to[i];
if(vis[y]) continue;
dfs(y,now);
}
}
inline int lca(int x,int y){
if(dep[x]>dep[y]) swap(x,y);
for(register int i=t;i>=0;i--){
if(dep[fate[y][i]]>=dep[x]) y=fate[y][i];
}//深度相同
if(x==y) return x;
for(register int i=t;i>=0;i--){
if(fate[x][i]!=fate[y][i]){
x=fate[x][i];
y=fate[y][i];
}
}
return fate[x][0];
}
signed main(void){
n=read();
t=log2(n)+1;
for(register int i=1;i<n;i++){
register int asd,jkl;
asd=read(),jkl=read();
add(asd,jkl),add(jkl,asd);
}
dfs(1,0);
for(register int j=1;j<=t;j++){
for(register int i=1;i<=n;i++){
fate[i][j]=fate[fate[i][j-1]][j-1];
}
}
cout<<lca(1,4);
return 0;
}