模板:最近公共祖先(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)的主要内容,如果未能解决你的问题,请参考以下文章

P3379 模板最近公共祖先(LCA)

Luogu P3379 模板最近公共祖先(LCA)

luogo p3379 模板最近公共祖先(LCA)

洛谷P3379 模板最近公共祖先(LCA)

LCA--P3379 模板最近公共祖先(LCA)

[模板]最近公共祖先LCA