LCA模板
作者:互联网
拿来存一下lca模板,想知道原理的话出门洛谷~
#include<bits/stdc++.h> using namespace std; const int maxn=500007; int cnt=0,head[maxn],fa[maxn][40],dep[maxn],lg[maxn]; struct lys{ int from,to,nex; }e[maxn*2]; void add(int from,int to){ cnt++; e[cnt].to=to;e[cnt].from=from; e[cnt].nex=head[from];head[from]=cnt; } void dfs(int now,int fath) { fa[now][0]=fath;dep[now]=dep[fath]+1; for(int i=1;i<=lg[dep[now]];i++) fa[now][i]=fa[fa[now][i-1]][i-1]; for(int i=head[now];i;i=e[i].nex) { if(e[i].to!=fath) dfs(e[i].to,now); } } int lca(int x,int y) { if(dep[x]<dep[y]) swap(x,y); while(dep[x]>dep[y]) x=fa[x][lg[dep[x]-dep[y]]-1]; if(x==y) return x; for(int k=lg[dep[x]]-1;k>=0;k--) if(fa[x][k]!=fa[y][k]) x=fa[x][k],y=fa[y][k];//you jump,I jump~ return fa[x][0]; } int n,m,s; int main() { //freopen("lys.in","r",stdin); cin>>n>>m>>s; for(int i=1;i<=n;i++) lg[i]=lg[i-1]+(1<<lg[i-1] == i); for(int i=1;i<n;i++) { int x,y; cin>>x>>y; add(x,y);add(y,x); } dfs(s,0); for(int i=1;i<=m;i++) { int a,b; cin>>a>>b; cout<<lca(a,b)<<endl; } }
标签:dep,cnt,lg,int,fa,maxn,LCA,模板 来源: https://www.cnblogs.com/liyishui2003/p/16467761.html