10pts on #4,其余全WA,求调
查看原帖
10pts on #4,其余全WA,求调
726870
Rainber楼主2024/6/10 20:21
#include<stdio.h>
#define MAXLOG 20
#define MAXN 500000
int f[MAXN][MAXLOG],dep[MAXN];
int queue[MAXN],m;
int next[MAXN*2],to[MAXN*2],head[MAXN];
char vis[MAXN];
void swap(int *p,int *q)
{
	int r=*p;
	*p=*q;
	*q=r;
}
int lca(int x,int y)
{
	if(dep[x]<dep[y])
	{
		swap(&x,&y);
	}
	int i;
	for(i=MAXLOG-1;i>=0;--i)
	{
		if(dep[f[x][i]]>=dep[y])
		{
			x=f[x][i];
		}

	}		
	if(x==y)
	{
		return x;
	}
	for(i=MAXLOG-1;i>=0;--i)
	{
		if(f[x][i]!=f[y][i])
		{
			x=f[x][i];
			y=f[y][i];
		}
	}
	return f[x][0];
}
void init(int s)
{
	int i,j,h=-1,t=0;
	queue[0]=s;
	vis[s]=1;
	dep[s]=1;
	while(h<t)
	{
		h++;
		for(i=head[queue[h]];i!=-1;i=next[i])
		{
			if(vis[to[i]]==0)
			{
				vis[to[i]]=1;
				t++;
				queue[t]=to[i];
				dep[to[i]]=dep[queue[h]]+1;
				f[to[i]][0]=queue[h];
				for(j=1;j<MAXLOG;++j)
				{
					f[to[i]][j]=f[f[to[i]][j-1]][j-1];
				}
			}
		}
	}
}
void asso(int r,int t)
{
	next[m]=head[r];
	to[m]=t;
	head[r]=m;
	m++;
}
int main()
{
	int n,m,s,i,j,r,t;
	scanf("%d%d%d",&n,&m,&s);
	for(i=0;i<n;++i)
	{
		head[i]=-1;
		for(j=0;j<MAXLOG;++j)
		{
			f[i][j]=-1;
		}
	}
	for(i=0;i<n-1;++i)
	{
		scanf("%d%d",&r,&t);
		asso(r-1,t-1);
		asso(t-1,r-1);
	}
	init(s-1);
	for(i=0;i<m;++i)
	{
		scanf("%d%d",&r,&t);
		printf("%d\n",lca(r-1,t-1)+1);
	}
	return 0;
}

记录

2024/6/10 20:21
加载中...