RE 0pts 求助 悬关
查看原帖
RE 0pts 求助 悬关
291509
Cupricion楼主2024/1/23 13:38
#include<bits/stdc++.h>
using namespace std;
int n,m,s;
int dep[1000010],f[1000010][35];
vector<int> e[1000010];
int mymin(int x,int y)
{
	return x<y? x:y;
} 
int dfs(int u,int fa)
{
	dep[u]=dep[fa]+1;
	f[u][0]=fa;
	for(int i=1;(1<<i)<=dep[u];i++)
    	f[u][i]=f[f[u][i-1]][i-1];
    for(int i=0;i<e[u].size();i++)
	{
        if(e[u][i]==fa) 
			continue;
        dfs(e[u][i],u);
    }
}
int lca(int x,int y)
{
    if(dep[x]>dep[y]) 
		swap(x,y);
    int d=dep[y]-dep[x];
    for(int i=30;i>=0;i--)
	{
        if(d&(1<<i))
        y=f[y][i];
    }
    if(x==y) 
		return x;
    for(int i=30;i>=0;i--)
	{
        if(dep[x]>=(1<<i)&&f[x][i]!=f[y][i])
        x=f[x][i],y=f[y][i];
    }
    return f[x][0];
}
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m>>s;
	for(int i=1;i<n;i++)
	{
		int u,v;
		cin>>u>>v;
		e[u].push_back(v);
		e[v].push_back(u);
	}
	dfs(s,0);
	int ans=INT_MAX;
	for(int i=1;i<=m;i++)
	{
		int u,v;
		cin>>u>>v;
		cout<<lca(u,v)<<'\n'; 
	}
	return 0;
}
2024/1/23 13:38
加载中...