倍增LCA70求助
查看原帖
倍增LCA70求助
430409
Coros_Trusds楼主2021/4/7 00:03
#include <cstdio>

#include <algorithm>

using namespace std; 

struct node
{
	int t;
	
	int nxt;
};

node e[10000005];

int head[10000005];

int top;

inline void add(int x,int y)
{
	top++;
	
	e[top].t=y;
	
	e[top].nxt=head[x];
	
	head[x]=top;
}

int dep[1000005],lg[1000005];

int f[100005][25]; 

inline void dfs(int now,int fa)
{
	f[now][0]=fa;
	
	dep[now]=dep[fa]+1;
	
	for(register int i=1;i<=lg[dep[now]];i++)
	{
		f[now][i]=f[f[now][i-1]][i-1];
	}
	
	for(register int i=head[now];i;i=e[i].nxt)
	{
		if(e[i].t!=fa)
		{
			dfs(e[i].t,now);
		}
	}
}

inline int LCA(int x,int y)
{
	if(dep[x]<dep[y])
	{
		swap(x,y);
	}
	
	while(dep[x]>dep[y])
	{
		x=f[x][lg[dep[x]-dep[y]]-1];
	}
	
	if(x==y)
	{
		return x;
	}
	
	for(register int k=lg[dep[x]]-1;k>=0;k--)
	{
		if(f[x][k]!=f[y][k])
		{
			x=f[x][k];
			
			y=f[y][k];
		}
	}
	
	return f[x][0];
}

int main()
{
	int n,m,s;
	
	scanf("%d%d%d",&n,&m,&s);
	
	for(register int i=1;i<=n-1;i++)
	{
		int x,y;
		
		scanf("%d%d",&x,&y);
		
		add(x,y);
		
		add(y,x);
	}
	
	for(register int i=1;i<=n;i++)
	{
		lg[i]=lg[i-1]+(1<<lg[i-1]==i);
	}
	
	dfs(s,0);
	
	for(register int i=1;i<=m;i++)
	{
		int x,y;
		
		scanf("%d%d",&x,&y);
		
		printf("%d\n",LCA(x,y));
	}
	
	return 0;
}
2021/4/7 00:03
加载中...