WA #11 求助
查看原帖
WA #11 求助
553310
Whisperain楼主2021/10/6 17:30

以下是代码 倍增LCA

#include<bits/stdc++.h>
using namespace std;

const int MAXN=500000+5;
const int MAXM=500000+5;

int head[MAXN];
int father[MAXN];
bool visited[MAXM];
int bianshu;//加边用

struct edge
{
	int v,next;
}g[2*MAXM];

void addedge(int u,int v)
{
	g[++bianshu].next=head[u];
	g[bianshu].v=v;
//	g[bianshu].u=u;
	head[u]=bianshu;
	return;
}

queue <int> q;
int dep[MAXN];
void bfs(int s,int depth)
{
	q.push(s);
	dep[s]=depth;
	while(!q.empty())
	{
		int ppp=q.front();
		q.pop();
		for(int i=head[ppp];i;i=g[i].next)
		{
			if(!visited[g[i].v])
			{
				visited[g[i].v]=true;
				father[g[i].v]=ppp;
				dep[g[i].v]=dep[ppp]+1;
				q.push(g[i].v);
			}
		}
	}
}

int jump[MAXN][30];

int main()
{
//	freopen("in.in","r",stdin);
//	freopen("test.out","w",stdout);
	int n,q,s;
	int uu,vv;
	int a,b;
	int tmp;//深度差 
	scanf("%d%d%d",&n,&q,&s);
	for(int i=1;i<=n-1;++i)
	{
		scanf("%d%d",&uu,&vv);
		addedge(uu,vv);
		addedge(vv,uu);
	}
	father[s]=s;
	visited[s]=true;
	bfs(s,1);
/*	for(int i=1;i<=n;++i)
	{
		printf("father[%d]=%d\n",i,father[i]);
	}*/
	for(int i=1;i<=n;++i)
	{
		jump[i][0]=father[i];
	}
	for(int j=1;j<=25;++j)
	{
		for(int i=1;i<=n;++i)
		{
			jump[i][j]=jump[jump[i][j-1]][j-1];
		}
	}
	while(q--)
	{
		scanf("%d%d",&a,&b);
		
		tmp=(dep[a]>dep[b]?dep[a]-dep[b]:dep[b]-dep[a]);
		if(!tmp)
		{
			for(int k=25;k>=0;--k)
			{
				if(jump[a][k]^jump[b][k])
				{
					a=jump[a][k];
					b=jump[b][k];
				}
			}
			printf("%d\n",father[a]);
			continue;
		}
		if(dep[a]>dep[b])
		{
			for(int k=25;k>=0;--k)
			{
				if(tmp>=(1<<k))
				{
					a=jump[a][k];
//					dep[a]-=(1<<k);
					tmp-=(1<<k);
				}
			} 
		}
		else
		{
			for(int k=25;k>=0;--k)
			{
				if(tmp>=(1<<k))
				{
					b=jump[b][k];
//					dep[b]-=(1<<k);
					tmp-=(1<<k);
				}
			} 
		}
		if(a==b)
		{
			printf("%d\n",a);
			continue;
		}
//		printf("tmp=%d\n",tmp);
		for(int k=25;k>=0;--k)
		{
			if((jump[a][k]^jump[b][k]))
			{
				a=jump[a][k];
				b=jump[b][k];
			}
		}
		printf("%d\n",father[a]);
	}
	return 0;
}

father、dep应该都没错,求问哪里挂了

2021/10/6 17:30
加载中...