Lowest Common Ancestor Algorithm

Zhiyuan Xu Lv1
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
namespace LCA{
#define BD 20
int lca(int u, int v) {
if(dep[u] < dep[v]) swap(u,v);
int diff = dep[u] - dep[v];
for(int i=0; i<BD; i++) if((diff>>i)&1 ) u = pa[u][i];
if(u == v) return u;
for(int i=BD-1; i>=0; i--) if(pa[u][i] != pa[v][i]) {
u = pa[u][i];
v = pa[v][i];
}
return pa[u][0];
}
void set_up_lca(int nn){
for(int i = 1 ; i <= BD ; i++)
for(int j = 0; j <= nn ; j++)
if(pa[j][i-1] != -1) pa[j][i] = pa[pa[j][i-1]][i-1] ;
}
void dfs(int pos, int depth, int prev){
pa[pos][0] = prev;
dep[pos] = depth;
for (int i=head[pos];i;i=edge[i].nxt){
int v = edge[i].v;
if (v==prev) continue;
dfs(v,depth+1,pos);
}
}
#undef BD
}
  • Title: Lowest Common Ancestor Algorithm
  • Author: Zhiyuan Xu
  • Created at : 2024-07-06 00:12:06
  • Updated at : 2024-07-06 00:12:12
  • Link: https://redefine.ohevan.com/Template/LCA/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments
On this page
Lowest Common Ancestor Algorithm