思路:N-1条边的无向图,DFS时b[x]记录x点是树的第几层,c[x]记录x点的父节点是谁。然后x和y谁的层数大谁向上,直到相遇 90分12到14号测试点TLE,求调
#include<bits/stdc++.h>
using namespace std;
struct st
{
int from,to,next;
}a[1000001];
int h[500001],cnt=1,b[500001],c[500001];
void add(int u,int v)
{
a[cnt].from=u;
a[cnt].to=v;
a[cnt].next=h[u];
h[u]=cnt;
cnt++;
}
void dfs(int k,int t)
{
int i;
for(i=h[k];i;i=a[i].next)
{
if(b[a[i].to]==0)
{
b[a[i].to]=t;
c[a[i].to]=k;
dfs(a[i].to,t+1);
}
}
}
int main()
{
int n,m,s,i,u,v,x,y;
cin>>n>>m>>s;
for(i=1;i<n;i++)
{
cin>>u>>v;
add(u,v);
add(v,u);
}
b[s]=1;
dfs(s,2);
for(i=0;i<m;i++)
{
cin>>x>>y;
while(x!=y)
{
if(b[x]<b[y])
y=c[y];
else
if(b[x]>b[y])
x=c[x];
else
if(x!=y)
x=c[x];
}
cout<<x<<endl;
}
return 0;
}