要把自己改死掉了,LCA调用时结果总为0,有dalao知道为什么吗……?
#include<bits/stdc++.h>
using namespace std;
const int N=1000010;
const int D=20;
int num=0,e[N*2],nxt[N*2],fir[N*2];
int dep[N];
int f[N][D+5];
void add(int x,int y){
num++;
e[num]=y;
nxt[num]=fir[x];
fir[x]=num;
}
void dfs(int i){
for(int j=1;j<=D;j++){
f[i][j]=f[f[i][j-1]][j-1];
}
//cout<<endl;
for(int k=fir[i];k;k=nxt[k]){
int j=e[k];
if(j!=f[i][0]){
f[j][0]=i;
dep[j]=dep[i]+1;
dfs(j);
}
}
}
/*int findLCA2(int x,int y){
while(x!=y){
if(dep[x]>dep[y]){
x=f[x][0];
}
else y=f[y][0];
cout<<x<<" "<<y<<endl;
}
return x;
}*/
int step(int x,int d){
for(int j=0;j<=D;j++){
if(d>>j&1){
x=f[x][j];
}
}
}
int findLCA(int x,int y){
if(dep[x]>dep[y]){
x=step(x,dep[x]-dep[y]);
}
else{
y=step(y,dep[y]-dep[x]);
}
if(x==y) return x;
for(int j=D;j>=0;j--){
if(f[x][j]!=f[y][j]){
x=f[x][j];
y=f[y][j];
}
}
return f[x][0];
}
int main(){
int n;
cin>>n;
for(int i=1;i<n;i++){
int x,y;
cin>>x>>y;
add(x,y);
}
dfs(1);
cout<<findLCA(3,5)<<endl;
return 0;
}