裸倍增LCA,样例第三个点输出0,求助!
查看原帖
裸倍增LCA,样例第三个点输出0,求助!
261262
WaltVBAlston楼主2020/11/1 09:58

如题,写了个倍增LCA,但是样例第三个点不知道为啥输出0了,我觉得不应该呀,我在dfs函数中都确立了fa[x][i]不会=0.

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int n,q,s,m;
int u[1000005],v[1000005],before[1000005],now[1000005],fa[500005][20],depth[500005];
int max_log=0;
void dfs(int x,int fath){
	fa[x][0]=fath;
	depth[x]=depth[fath]+1;
	for(int i=1;i<=max_log;i++){
		fa[x][i]=fa[fa[x][i-1]][i-1];
	}
	for(int i=now[x];i!=-1;i=before[i]){
		if(v[i]!=fath)
			dfs(v[i],x);
	}
	return;
}
int lca(int a,int b){
	if(depth[a]<depth[b])
		swap(a,b);
	for(int i=max_log;i>=0;i--)
		if(depth[fa[a][i]]>=depth[b])
			a=fa[a][i];
	if(a==b)
		return a;
	for(int i=max_log;i>=0;i--){
		if(fa[a][i]!=fa[b][i]){
			a=fa[a][i];
			b=fa[b][i];
		}
	}
	return fa[a][0];
}
int main(){
	cin>>n>>q>>s;
	m=n-1;
	memset(now,-1,sizeof(now));
	for(int i=1;i<=m;i++){
		cin>>u[i]>>v[i];
		before[i]=now[u[i]];
		now[u[i]]=i;
	}
	for(int i=m;i<=2*m;i++){
		u[i]=v[i-m];
		v[i]=u[i-m];
		before[i]=now[u[i]];
		now[u[i]]=i;
	}
	depth[s]=1;
	while(pow(max_log,2)<n)
		max_log++;
	dfs(s,s);
	while(q--){
		int a,b;
		cin>>a>>b;
		cout<<lca(a,b)<<endl;
	}
	return 0;
}
2020/11/1 09:58
加载中...