40pts求助
查看原帖
40pts求助
259300
hy233楼主2021/10/2 11:36
#include<bits/stdc++.h>
using namespace std;
int n;
vector<int> ed[500005];
int fa[500005][18];
int dep[500005];
void dfs(int s,int la,int d)
{
	fa[s][0]=la;
	dep[s]=d;
	for(int i=1;i<=log2(dep[s]);i++)
	{
		fa[s][i]=fa[fa[s][i-1]][i-1];
	}
	for(int i=0;i<ed[s].size();i++)
	{
		if(ed[s][i]==la) continue;
		dfs(ed[s][i],s,d+1);
	}
}
int lca(int a,int b)
{
	if(dep[a]<dep[b])
		swap(a,b);
	while(dep[a]>dep[b])
	{
		int u=dep[a]-dep[b];
		a=fa[a][int(log2(u))];
	}
	if(a==b)
		return a;
	for(int k=log2(dep[a])-1;k>=0;k--)
	{
		if(fa[a][k]!=fa[b][k])
		{
			a=fa[a][k];
			b=fa[b][k];
		}
	}
	return fa[a][0];
}
int main()
{
	int m,s;
	cin>>n>>m>>s;
	for(int i=1;i<n;i++)
	{
		int x,y;
		cin>>x>>y;
		ed[x].push_back(y);
		ed[y].push_back(x);
	}
	dfs(s,0,0);
	while(m--)
	{
		int a,b;
		cin>>a>>b;
		cout<<lca(a,b)<<endl;
	}
	return 0;
}
2021/10/2 11:36
加载中...