由于python超时了四五个点,所以用C++写了一下
AC代码
#include<iostream>
#include<vector>
using namespace std;
#define N 500010
int n,m,s;
int vis[N],far[N][20],dep[N];
vector<int> point[N];
void dfs(int root,int deep){
dep[root]=deep;
vis[root]=1;
for(int i=0;i<point[root].size();i++){
int tmp=point[root][i];
if(!vis[tmp]){
far[tmp][0]=root;
dfs(tmp,deep+1);
}
}
}
void get_far(){
for(int j=1;j<20;j++){
for(int i=1;i<=n;i++){
if(far[i][j-1]==0)
continue;
far[i][j]=far[far[i][j-1]][j-1];
}
}
}
int lca(int x,int y){
if(dep[x]<dep[y]){
int tmp=x;
x=y;
y=tmp;
}
//切换至同一层
for(int i=19;i>=0;i--){
if( (dep[x]-(1<<i))>=dep[y] )
x=far[x][i];
}
if(x==y)
return x;
for(int i=19;i>=0;i--){
if(far[x][i]!=0 && far[x][i]!=far[y][i]){
x=far[x][i];
y=far[y][i];
}
}
return far[x][0];
}
int main(){
int x,y;
cin>>n>>m>>s;
for(int i=0;i<n-1;i++){
scanf("%d %d",&x,&y);
point[x].push_back(y);
point[y].push_back(x);
}
dfs(s,1);
get_far();
for(int i=0;i<m;i++){
scanf("%d %d",&x,&y);
printf("%d\n",lca(x,y));
}
return 0;
}