P3379 LCA 求调
  • 板块题目总版
  • 楼主MunYixty
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/1/20 11:13
  • 上次更新2023/10/24 03:32:32
查看原帖
P3379 LCA 求调
868365
MunYixty楼主2023/1/20 11:13
#include<bits/stdc++.h>
using namespace std;   
int n,m;
int idx;
struct AA
{
	int t,nex;
}e[500005];
int s;
int fa[500005][26],depth[500005];
int head[500005];
void add(int x,int y)
{
	e[++idx].t=y;
	e[idx].nex=x;
	head[x]=idx;	
}
void dfs(int x,int p)
{
	fa[x][0]=p;
	depth[x]=depth[p]+1;
	for(int i=1;i<=log(depth[x])/log(2)+1;i++)
	{
		fa[x][i]=fa[fa[x][i-1]][i-1];
	}
	for(int i=head[x];i;i=e[i].nex)
	{
		if(e[i].t!=p) dfs(e[i].t,x);
	}
	
}

int LCA(int x,int y)
{
	if(depth[x]<depth[y])
	{
		swap(x,y);
	}
	while(depth[x]>depth[y])
	{
		int kk=log(depth[x]-depth[y])/log(2);
		x = fa[x][kk]; 
	}
	if(x==y)return x;
	for(int k = log(depth[x])/log(2); k >= 0; --k)
	{
	
		if(fa[x][k] != fa[y][k])
			x = fa[x][k], y = fa[y][k];
	}
	return fa[x][0];
}
int main() 
{
	scanf("%d%d%d",&n,&m,&s);
	for(int i=1;i<=n-1;i++)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		add(x,y);
		add(y,x);
	}
	dfs(s,0); 
	for(int i=1;i<=m;i++)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		printf("%d\n",LCA(x,y));
		
	}
	return 0;
}
2023/1/20 11:13
加载中...