倍增LCA求助
查看原帖
倍增LCA求助
291481
novax楼主2021/8/7 09:39

本地和洛谷在线IDE自测都没有问题(样例和测试点1),提交则为WA+RE,求找UB。

#include <cstdio>
//倍增LCA 
struct edge
{
	int to,nex;
};
edge a[1000010];
int head[500010],cnt;
void add(int u,int v)
{
	a[++cnt].to=v;
	a[cnt].nex=head[u];
	head[u]=cnt;
}
int swp(int &x,int &y)
{int c;c=x;x=y;y=c;}
int dep[500010],fa[500010][23];
int lg[500010];
int N,M,root;
void dfs(int p,int fat)
{
	fa[p][0]=fat;
	dep[p]=dep[fat]+1;
	int i;
	for(i=1;i<=lg[dep[p]];i++)
		fa[p][i]=fa[fa[p][i-1]][i-1];
	for(i=head[p];i;i=a[i].nex)
		if(a[i].to!=fat)
			dfs(a[i].to,p);
	return;
}
int LCA(int x,int y)
{
	int i,w;
	if(dep[x]<dep[y])
		swp(x,y);
	w=dep[x]-dep[y];
	for(i=0;i<=lg[w]+1;i++)
		if(w&(1<<i))
			x=fa[x][i];
	if(x==y)
		return x;
	for(i=lg[N];i>=0;i--)
	{
		if(fa[x][i]!=fa[y][i])
		{
			x=fa[x][i];
			y=fa[y][i];
		}
	}
	return fa[x][0];
}
int main()
{
	int i,j,k;
	scanf("%d%d%d",&N,&M,&root); 
	lg[1]=0;lg[2]=1;
	for(i=3;i<=N+8;i++)
		lg[i]=lg[i>>1]+1;
	for(i=1;i<N;i++)
	{
		scanf("%d%d",&j,&k);
		add(j,k);
		add(k,j);
	}
	dfs(root,0);
	for(i=1;i<=M;i++)
	{
		scanf("%d%d",&j,&k);
		printf("%d\n",LCA(j,k));
	}
}

三次提交RE的点都不一样...谢谢大家了

2021/8/7 09:39
加载中...