倍增lca,0ptWA求条
查看原帖
倍增lca,0ptWA求条
756563
Suare_Pi楼主2024/6/16 10:50
#include <bits/stdc++.h>
using namespace std;
const int  M=500005;
int n,m,s,t;
int f[M],d[M][25];
int tot,ver[M*2],head[M],ne[M*2];
void add(int x,int y)
{
	tot++;
	ver[tot]=y;
	ne[tot]=head[x];
	head[x]=tot;
}
void dfs(int u,int fa)
{	
	for(int i=head[u];i!=-1;i=ne[i])
	{
		int v=ver[i];
		if(v==fa)
			continue;
		f[v]=f[u]+1;
		d[u][0]=u;
		for(int i=0;i<=t;i++)
		{
			d[v][i]=d[d[v][i-1]][i-1];
		}
		dfs(v,u);
	}
}
int lca(int x,int y)
{
	if(x==y)
		return x;
	if(f[x]<f[y])
		swap(x,y);
	for(int i=t;i>=0;i--)
	{
		if(f[d[x][i]]>=f[y])
			x=d[x][i];
	}
	if(x==y)
		return x;
	for(int i=t;i>=0;i--)
	{
		if(d[x][i]!=d[y][i])
		{
			x=d[x][i];
			y=d[y][i];
		}
	}
	return d[x][0];
}
int main()
{
	cin>>n>>m>>s;
	memset(head,-1,sizeof(head));
	t=log(n)/log(2)+1;
	for(int i=1;i<n;i++)
	{
		int x,y;
		cin>>x>>y;
		add(x,y);
		add(y,x);
	}
	f[s]=1;
	dfs(s,-1);
	for(int i=1;i<=m;i++)
	{
		int x,y;
		cin>>x>>y;
		cout<<lca(x,y)<<endl;
	}
	return 0;
}
2024/6/16 10:50
加载中...