1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
| #include<bits/stdc++.h> using namespace std; #define ll long long const int N = 1e6+10; struct Node{ int to,next,val; }edge[N]; int pre[N][25]; int d[N]; int head[N],cnt; void add(int u,int v){ cnt++; edge[cnt].next=head[u]; edge[cnt].to=v; edge[cnt].val=0; head[u]=cnt; } void dfs(int u){ for(int i=head[u];~i;i=edge[i].next){ int v = edge[i].to; if(d[v]==0) { d[v] = d[u] + 1; pre[v][0] = u; dfs(v); } } } int lca(int x,int y){ if(d[x]<d[y])swap(x,y); for(int i=20;i>=0;i--){ if(d[pre[x][i]]>=d[y]){ x=pre[x][i]; } } if(x==y)return x; for(int i=20;i>=0;i--){ if(pre[x][i]!=pre[y][i]){ x=pre[x][i]; y=pre[y][i]; } } return pre[x][0]; } int main(){ int n,m,s; scanf("%d%d%d",&n,&m,&s); memset(head,-1,sizeof(head)); for(int i=0;i<n-1;i++){ int u,v; scanf("%d %d",&u,&v); add(u,v); add(v,u); } pre[s][0]=0; d[s]=1; dfs(s); for(int i=1;i<=20;i++){ for(int x=1;x<=n;x++){ pre[x][i]=pre[pre[x][i-1]][i-1]; } } for(int i=0;i<m;i++){ int u,v; scanf("%d %d",&u,&v); printf("%d\n",lca(u,v)); } }
|