C++语言
#include<bits/stdc++.h>
#define N 1000005
using namespace std;
struct edge
{
int u,v,next;
}s[N];
int ecnt;
int head[N]={0},f[N][21],d[N];
void add(int u,int v)
{
s[++ecnt].u=u;
s[ecnt].v=v;
s[ecnt].next=head[u];
head[u]=ecnt;
}
void dfs(int u,int fa)
{
f[u][0]=fa;
d[u]=d[fa]+1;
for(int i=1;(1<<i)<=d[u];i++)
f[u][i]=f[f[u][i-1]][i-1];
for(int i=head[u];i;i=s[i].next)
{
if(s[i].v!=fa)
dfs(s[i].v,u);
}
}
int lca(int x,int y)
{
if(d[y]<d[x])
swap(x,y);
for(int i=5;i>-1;i--)
{
if(d[f[y][i]]<d[x])
continue;
y=f[y][i];
}
if(x==y)
return x;
for(int i=5;i>-1;i--)
{
if(f[x][i]==f[y][i])
continue;
y=f[y][i];
x=f[x][i];
}
return f[x][0];
}
int main()
{
int n,m,s;
scanf("%d%d%d",&n,&m,&s);
int u,v;
for(int i=1;i<=n-1;i++)
{
scanf("%d%d",&u,&v);
add(u,v);
add(v,u);
}
for(int i=1;i<=m;i++)
{
int j,z;
scanf("%d%d",&j,&z);
dfs(s,0);
printf("%d\n",lca(j,z));
}
return 0;
}
已经用了scanf,printf了