倍增求助
查看原帖
倍增求助
1065071
Atserckcn楼主2024/6/9 09:25
#include<bits/stdc++.h>
using namespace std;
const int MAXM=500005;
inline void read(int &num)
{
	char ch=getchar();
	while(ch<'0'||ch>'9')
		ch=getchar();
	while(ch>='0'&&ch<='9')
	{
		num=(num<<1)+(num<<3)+(ch-'0');
		ch=getchar();
	}
	return;
}
int n,m,s,cnt;
struct EDGE{
	int from,to,pre;
}edge[MAXM<<1];
int u,v,head[MAXM];
void add(int from,int to)
{
	edge[++cnt].from=from;
	edge[cnt].to=to;
	edge[cnt].pre=head[from];
	head[from]=cnt;
	return;
}
int lca[MAXM][25],dep[MAXM];
void dfs(int u,int fa)
{
	dep[u]=dep[fa]+1;
	lca[u][0]=fa;
	for(int i=1;(1<<i)<=dep[u];i++)
		lca[u][i]=lca[lca[u][i-1]][i-1];
	for(int i=head[u];i;i=edge[i].pre)
		if(edge[i].to!=fa)
			dfs(edge[i].to,u);
	return;
}
int getlca(int a,int b)
{
	if(dep[a]>dep[b]) swap(a,b);
	for(int i=23;i>=0;i--)
		if(dep[b]-(1<<i)>=dep[a])
			b=lca[b][i];
	if(a==b) return a;
	for(int i=23;i>=0;i--)
	{
		if(lca[a][i]!=lca[b][i]&&lca[a][i]!=0)
		{
			a=lca[a][i];
			b=lca[b][i];
		}
	}
	return lca[b][0];
}
int main(){
	read(n),read(m),read(s);
	for(int i=1;i<n;i++)
	{
		read(u),read(v);
		add(u,v);
		add(v,u);
	}
	dfs(s,s);
	for(int i=1;i<=m;i++)
	{
		read(u),read(v);
		printf("%d\n",getlca(u,v));
	}
	return 0;
}
2024/6/9 09:25
加载中...