LCA初始化bug求助
查看原帖
LCA初始化bug求助
642173
KarmaticEnding楼主2024/6/23 16:42

如题,我用的LCA做法 在样例

5
0 0 2 2
1
2 3 4

中,如代码,我在init_LCA()之前的fa[3][0]是 22,没有任何问题,但是在init_LCA()之后的fa[3][0]就变成了 00,不知道为什么。

然后我具体输出查看,发现在 i=2,j=16i=2,j=16的时候fa[3][0]=2,但是 i=2,j=17i=2,j=17时fa[3][0]=0。

后来我将所有的 1717 改成了 1616 就过了(除了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);
	}
}
2024/6/23 16:42
加载中...