代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int n,m,s;
struct Edge{
int next,to;
};
Edge edge[N];//链式前向星
int ceg;
int f[N],dep[N],id[N];
int hed[N];
vector<int> g[N];
int add_edge(int u,int v){
edge[++ceg].next=hed[u];
edge[ceg].to=v;
hed[u]=ceg;
}
int p[N][40],len;
void dfs(int x,int fa){
f[x]=fa;
p[++len][0]=x;
id[x]=len;
dep[x]=dep[fa]+1;
// for(int i=0;i<g[x].size();i++){
for(int i=hed[x];i;i=edge[i].next){
if(edge[i].to==fa)continue;
dfs(edge[i].to,x);
p[++len][0]=x;
}
}
int compare(int x,int y){
return dep[x]<dep[y]?x:y;
}
int query(int l,int r){
int z=log2(r-l+1);
return compare(p[l][z],p[r-(1<<z)+1][z]);
}
int lca(int x,int y){
return query(min(id[x],id[y]),max(id[x],id[y]));
}
int main(){
cin>>n>>m>>s;
for(int i=1;i<n;i++){
int u,v;
cin>>u>>v;
add_edge(u,v);
add_edge(v,u);
// g[u].push_back(v);
// g[v].push_back(u);
}
// return 0; //这里注释掉#2就WA,不注释掉#2就RE
dfs(s,0);
for(int i=1;(1<<i)<=len;i++){
for(int j=1;j-1+(1<<i)<=len;j++){
p[j][i]=compare(p[j][i-1],p[j+(1<<i-1)][i-1]);
}
}
for(int i=1;i<=m;i++){
int x,y;
cin>>x>>y;
cout<<lca(x,y)<<endl;
}
}
样例能过,#1下载下来也AC,但是在评测机上WA 记录(注释return0) 记录(不注释return0) 但是改成邻接表就AC。。。