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 68
| #include <iostream> using namespace std; const int N=500005; int head[N],nxt[N*2],to[N*2]; int size[N],dep[N],fa[N],son[N],top[N]; int num=0; void add(int f,int t){ num++; to[num]=t; nxt[num]=head[f]; head[f]=num; } void dfs1(int u,int f){ size[u]=1; for(int i=head[u];i;i=nxt[i]){ int v=to[i]; if(v==f) continue; dep[v]=dep[u]+1; fa[v]=u; dfs1(v,u); size[u]+=size[v]; if(size[v]>size[son[u]]){ son[u]=v; } } } void dfs2(int u,int t) { top[u]=t; if(!son[u]){ return; } dfs2(son[u],t); for(int i=head[u];i;i=nxt[i]){ int v=to[i]; if(v!=fa[u]){ if(v!=son[u])dfs2(v,v); } } } int main(){ int n,m,s; cin>>n>>m>>s; for(int i=1;i<=n-1;i++){ int x,y; cin>>x>>y; add(x,y); add(y,x); } dep[s]=1; dfs1(s,0); dfs2(s,0); while(m--){ int x,y; cin>>x>>y; while(top[x]!=top[y]){ if(dep[top[x]]>dep[top[y]]){ x=fa[top[x]]; }else{ y=fa[top[y]]; } } cout<<(dep[x]<dep[y]?x:y)<<endl; } return 0; }
|