RT,刚接触树剖,写个模板心态炸了。。。这个vector存图到底哪里出了问题啊()一直不对
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
typedef long long ll;
struct node
{
int fa,deep,size,top,son,dfn;
}t[maxn];
int rnk[maxn];
vector<int>c[maxn];
void dfs1(int x)
{
// cout<<x<<endl;
t[x].size=1;
t[x].deep=t[t[x].fa].deep+1;
for(int i=0;i<c[x].size();i++)
{
// cout<<"size:"<<c[x].size()<<endl;
if(c[x][i]=t[x].fa)
continue;
t[c[x][i]].fa=x;
dfs1(c[x][i]);
t[x].size+=t[c[x][i]].size;
if(!t[x].son||t[c[x][i]].size>t[t[x].son].size)
t[x].son=c[x][i];
}
return;
}
int cnt=0;
void dfs2(int x,int tp)
{
t[x].top=tp;
cnt++;
t[x].dfn=cnt;
rnk[cnt]=x;
if(t[x].son)
dfs2(t[x].son,tp);
for(int i=0;i<c[x].size();i++)
{
// cout<<x<<" "<<c[x][i]<<" "<<endl;
if(c[x][i]==t[x].son||c[x][i]==t[x].fa)
continue;
dfs2(c[x][i],c[x][i]);
}
return;
}
int lca(int x,int y)
{
while(t[x].top!=t[y].top)
{
if(t[t[x].top].deep>=t[t[y].top].deep)
x=t[t[x].top].fa;
else
y=t[t[y].top].fa;
}
return (t[x].deep<t[y].deep?x:y);
}
inline int read()
{
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9')
{
if(c=='-')
f=-1;
c=getchar();
}
while(c>='0'&&c<='9')
{
x=x*10+int(c-'0');
c=getchar();
}
return x*f;
}
int main()
{
// ios::sync_with_stdio(false);
int n,m,s;
// n=read();m=read();s=read();
cin>>n>>m>>s;
for(int i=1;i<=n-1;i++)
{
int uk,vv;
cin>>uk>>vv;
c[uk].push_back(vv);
// cout<<c[u][c[u].size()-1]<<"x"<<c[u].size()<<endl;
c[vv].push_back(uk);
}
// cout<<endl<<endl;
t[s].deep=0;
dfs1(s);
dfs2(s,s);
for(int i=1;i<=m;i++)
{
int x,y;
cin>>x>>y;
printf("%d\n",lca(x,y));
}
return 0;
}