悬棺求助30pts
查看原帖
悬棺求助30pts
719619
drinktowind楼主2024/4/20 13:42
#include <bits/stdc++.h>
using namespace std;
const int maxn=500010;
struct node{
	int to,next;
}a[maxn<<1];
int head[maxn],lg[maxn],f[maxn][22],depth[maxn],cnt;
void add(int u,int v)
{
	a[++cnt].to=v;
	a[cnt].next=head[u];
	head[u]=cnt;
}
void dfs(int k,int fa)
{
	f[k][0]=fa;
	depth[k]=depth[fa]+1;
	for(int i=1;i<=lg[depth[k]];i++)
		f[k][i]=f[f[k][i-1]][i-1];
	for(int i=head[k];i;i=a[i].next)
	{
		if(a[i].to!=fa)
			dfs(a[i].to,k);
	}
}
int LCA(int x,int y)
{
	if(depth[x]<depth[y])
		swap(x,y);
	while(depth[x]>depth[y])
		x=f[x][lg[depth[x]-depth[y]]-1];
	if(x==y)
		return x;
	for(int i=lg[depth[x]]-1;i>=0;i--)
	{
		if(f[x][i]!=f[y][i])
		{
			x=f[x][i];
			y=f[y][i];
		}
	}
	return f[x][0];
}
int main()
{
	int n,m,u,v,k,x,y;
	scanf("%d%d%d",&n,&m,&k);
	for(int i=1;i<n;i++)
	{
		scanf("%d%d",&u,&v);
		add(u,v);
		add(v,u);
	}
	for(int i=1;i<=n;i++)
		lg[i]=lg[i-1]+(1<<lg[i-1]==1);
	dfs(k,0);
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d",&x,&y);
		printf("%d\n",LCA(x,y));
	}
	return 0;
}

寄录

2024/4/20 13:42
加载中...