用同一份代码交了几遍,结果都不一样。
#include<bits/stdc++.h>
using namespace std;
struct node{
int son;
};
vector<node>g[500001];
int n,m,l,maxn=-1;
int f[500001][20];
int d[500001];
int xx[500001],yy[500001];
bool flag[500001];
void D(int s)
{
if(flag[s]==1)
return ;
flag[s]=1;
for(int i=0;i<g[s].size();i++)
if(flag[g[s][i].son]==0)
{
d[g[s][i].son]=d[s]+1;
maxn=max(maxn,d[s]+1);
D(g[s][i].son);
}
return ;
}
void ST()
{
for(int j=1;j<=ceil(log2(maxn));j++)
for(int i=1;i<=n;i++)
f[i][j]=f[f[i][j-1]][j-1];
return ;
}
void LCA(int x,int y)
{
if(d[x]>d[y])
swap(x,y);
for(int i=ceil(log2(maxn));i>=0;i--)
if(d[f[y][i]]>=d[x])
y=f[y][i];
// cout<<x<<" "<<y<<endl;
if(x==y)
{
cout<<x<<endl;
// cout<<endl;
return ;
}
for(int i=ceil(log2(maxn));i>=0;i--)
if(f[x][i]!=f[y][i])
{
x=f[x][i];y=f[y][i];
}
cout<<f[x][0]<<endl;
// cout<<endl;
return ;
}
node eg;
int main()
{
cin>>n>>m>>l;
d[l]=1;
for(int i=1;i<n;i++)
{
int x,y;
cin>>x>>y;xx[i]=x;yy[i]=y;
eg.son=x;
g[y].push_back(eg);
eg.son=y;
g[x].push_back(eg);
}
D(l);
for(int i=1;i<n;i++)
{
if(d[xx[i]]>d[yy[i]])
f[xx[i]][0]=yy[i];
else
f[yy[i]][0]=xx[i];
}
ST();
// cout<<endl;
// for(int i=1;i<=n;i++)
// cout<<d[i]<<" ";
// cout<<endl<<endl;
// for(int i=1;i<=n;i++)
// {
// for(int j=1;j<=ceil(log2(maxn));j++)
// cout<<f[i][j]<<" ";
// cout<<endl;
// }
for(int i=1;i<=m;i++)
{
int x,y;
cin>>x>>y;
LCA(x,y);
}
return 0;
}