(模板)LCA

树下

2018-10-16 18:44:38

Personal

```cpp #include<bits/stdc++.h> using namespace std; const int N=500001; int head[N],deep[N],ans[N][23]; int n,m,s,cnt; template <class sjy> inline void read(sjy &x){ sjy f=1;x=0;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();} x*=f; } struct edge{ int to,next; }a[N<<1]; void add(int x,int y){ a[++cnt].next=head[x]; a[cnt].to=y; head[x]=cnt; } void dfs(int now,int from){ for(int i=head[now];i;i=a[i].next){ int v=a[i].to; if(v==from) continue; deep[v]=deep[now]+1; dfs(v,now); ans[v][0]=now; } } int lca(int x,int y){ if(deep[x]<deep[y]) swap(x,y); for(int i=22;i>=0;i--) if(deep[x]-(1<<i)>=deep[y]) x=ans[x][i]; if(x==y) return x; for(int i=22;i>=0;i--) if(ans[x][i]!=ans[y][i]){ x=ans[x][i]; y=ans[y][i]; } return ans[x][0]; } int main(){ int x,y; read(n),read(m),read(s); for(int i=1;i<n;i++){ read(x),read(y); add(x,y);add(y,x); } dfs(s,s); for(int i=1;i<=22;i++) for(int j=1;j<=n;j++) ans[j][i]=ans[ans[j][i-1]][i-1]; for(int i=1;i<=m;i++){ read(x),read(y); printf("%d\n",lca(x,y)); } } ```