求助 subtask1 就对了第二个
查看原帖
求助 subtask1 就对了第二个
892323
AkTtt楼主2023/4/11 15:18
#include <iostream>
#include <cstring>
#include <cstdio>

using namespace std;
const int N=5e5+10,M=N*2;

int d[N],fa[N][17],n,m,root;
int e[M],ne[M],h[N],idx,q[N];

void add(int x,int y)
{
	e[idx]=y,ne[idx]=h[x],h[x]=idx++;
}

void bfs(int x)
{
	memset(d,0x3f,sizeof d);
	d[0]=0,d[x]=1;
	int hh=1,tt=1;
	q[1]=x;
	while(hh<=tt)
	{
		int t=q[hh++];
		for(int i=h[t];~i;i=ne[i])
		{
			int j=e[i];
			if(d[j]>d[t]+1)
			{
				d[j]=d[t]+1;
				q[++tt]=j;
				fa[j][0]=t;
				for(int k=1;k<=16;k++)
				{
					fa[j][k]=fa[fa[j][k-1]][k-1];
				}
			}
		}
	}
}

int lca(int x,int y)
{
	if(d[x]<d[y])swap(x,y);
	for(int i=16;i>=0;i--)
	{
		if(d[fa[x][i]]>=d[y])x=fa[x][i];
	}
	if(x==y)return x;
	for(int i=16;i>=0;i--)
	{
		if(fa[x][i]!=fa[y][i])
		{
			x=fa[x][i];
			y=fa[y][i];
		}
	}
	return fa[x][0];
}

int main()
{
	scanf("%d%d%d",&n,&m,&root);
	memset(h,-1,sizeof h);
	while(--n)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		add(x,y),add(y,x);
	}
	bfs(root);
	while(m--)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		if(x==y)printf("%d\n",x);
		else 
		{
			int p=lca(x,y);
			printf("%d\n",p);
		}
	}
}
2023/4/11 15:18
加载中...