蒟蒻LCA求调
  • 板块灌水区
  • 楼主李逸然123
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/6/1 17:06
  • 上次更新2023/10/23 14:09:54
查看原帖
蒟蒻LCA求调
451850
李逸然123楼主2023/6/1 17:06

代码如下:

#include<bits/stdc++.h>
using namespace std;
struct node
{
	int to,nxt;
}edge[1000005];
int head[500005],tot,dep[500005],f[500005][23];
int n,m,s;
void add(int x,int y)
{
	edge[++tot].to=y;
	edge[tot].nxt=head[x];
	head[x]=tot;
}
void dfs(int x,int fa)
{
	int i;
	dep[x]=dep[fa]+1;
	for(i=1;i<=20;i++)
		f[x][i]=f[f[x][i-1]][i-1];
	for(i=head[x];i;i=edge[i].nxt)
	{
		int y=edge[i].to;
		if(y=fa) continue;
		f[y][0]=x;
		dfs(y,x);
	}
}
int lca(int x,int y)
{
	if(dep[x]<dep[y]) swap(x,y);
	int i;
	for(i=20;i>=0;i--)
	{
		if(dep[f[x][i]]>=dep[y])
			x=f[x][i];
	}
	if(x==y) return x;
	for(i=20;i>=0;i--)
	{
		if(f[x][i]==f[y][i]) continue;
		x=f[x][i];
		y=f[y][i];
	}
	return f[x][0];
}
int main()
{
	int i,j,ans;
	scanf("%d%d%d",&n,&m,&s);
	for(i=1;i<=n-1;i++)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		add(x,y);
		add(y,x);
	}
	for(i=1;i<=n;i++)
		f[i][0]=i;
	dfs(s,0);
	for(i=1;i<=m;i++)
	{
		int a,b;
		cin>>a>>b;
		ans=lca(a,b);
		cout<<ans<<endl;
	}
	return 0;
}
2023/6/1 17:06
加载中...