如题,我用的LCA做法 在样例
5
0 0 2 2
1
2 3 4
中,如代码,我在init_LCA()之前的fa[3][0]是 2,没有任何问题,但是在init_LCA()之后的fa[3][0]就变成了 0,不知道为什么。
然后我具体输出查看,发现在 i=2,j=16的时候fa[3][0]=2,但是 i=2,j=17时fa[3][0]=0。
后来我将所有的 17 改成了 16 就过了(除了Hack数据
有没有大佬指导一下是怎么回事……它怎么会越界呢???
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e5;
int fa[MAXN][17],depth[MAXN];//使用father[i][j]表示节点i向上跳2^j的深度到达的节点
int n,Q;
vector<int> G[MAXN];//这是一个图
void dfs(int u,int f){
for(int v:G[u]){
if(f==v){
continue;
}
depth[v]=depth[u]+1;
fa[v][0]=u;
dfs(v,u);
}
}
void init_LCA(){
for(int i=1;i<n;++i){
for(int j=1;j<=17;++j){
fa[i][j]=fa[fa[i][j-1]][j-1];
}
}
}
int LCA(int u,int v){
if(depth[u]<depth[v]){
swap(u,v);//交换位置方便操作,使u变成最深的
}
for(int i=17;i>=0;--i){
if(depth[u]-(1<<i)>=depth[v]){
u=fa[u][i];//一直倍增跳
}
}
if(u==v){
return u;
}
for(int i=17;i>=0;--i){
if(fa[u][i]!=fa[v][i]){
//一直跳
u=fa[u][i];
v=fa[v][i];
}
}
return fa[u][0];
}
int main(){
memset(fa,0,sizeof(fa));
scanf("%d",&n);
for(int i=1;i<n;++i){
scanf("%d",&fa[i][0]);
G[i].push_back(fa[i][0]);
G[fa[i][0]].push_back(i);
}
fa[0][0]=0;
dfs(0,0);
init_LCA();
scanf("%d",&Q);
while(Q--){
int m;
scanf("%d",&m);
int a,b;
scanf("%d%d",&a,&b);
int parent=LCA(a,b);
int x;
for(int i=3;i<=m;++i){
scanf("%d",&x);
parent=LCA(parent,x);
}
printf("%d\n",parent);
}
}