模板:最近公共祖先(LCA)
Posted aze-qwq
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模板:最近公共祖先(LCA)相关的知识,希望对你有一定的参考价值。
https://www.luogu.org/problemnew/show/P3379
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 int m, n, s; 5 struct qwq{ 6 int t, nex; 7 }edge[2*500001]; 8 int d[500001], f[500001][25], lg[500001], head[500001]; 9 int sum; 10 void add(int x, int y){ 11 edge[++sum].t=y; 12 edge[sum].nex=head[x]; 13 head[x]=sum; 14 } 15 void dfs(int a, int ft){ 16 d[a]=d[ft]+1; 17 f[a][0]=ft; 18 for(int i=1; (1<<i)<=d[a]; i++) 19 f[a][i]=f[f[a][i-1]][i-1]; 20 for(int i=head[a]; i; i=edge[i].nex) 21 if(edge[i].t!=ft) dfs(edge[i].t,a); 22 } 23 int lca(int x,int y){ 24 if(d[x]<d[y]) swap(x,y); 25 while(d[x]>d[y]) 26 x=f[x][lg[d[x]-d[y]]-1]; 27 if(x==y) return x; 28 for(int k=lg[d[x]]; k>=0; k--) 29 if(f[x][k]!=f[y][k]) x=f[x][k], y=f[y][k]; 30 return f[x][0]; 31 } 32 int main(){ 33 scanf("%d%d%d",&n,&m,&s); 34 for(int i=1; i<=n-1; i++){ 35 int x, y; 36 scanf("%d%d",&x,&y); 37 add(x,y); 38 add(y,x); 39 } 40 dfs(s,0); 41 for(int i=1; i<=n; i++) 42 lg[i]=lg[i-1]+(1<<lg[i-1]==i); 43 for(int i=1; i<=m; i++){ 44 int x,y; 45 scanf("%d%d",&x,&y); 46 printf("%d ",lca(x,y)); 47 } 48 return 0; 49 }
以上是关于模板:最近公共祖先(LCA)的主要内容,如果未能解决你的问题,请参考以下文章