Advertisement
t_naveen_2308

LCA

Feb 25th, 2025
205
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.61 KB | None | 0 0
  1. // Preprocess:
  2. int par[MAXN][MAXLOG]; // initially all -1
  3. void dfs(int v,int p = -1){
  4.     par[v][0] = p;
  5.     if(p + 1)
  6.         h[v] = h[p] + 1;
  7.     for(int i = 1;i < MAXLOG;i ++)
  8.         if(par[v][i-1] + 1)
  9.             par[v][i] = par[par[v][i-1]][i-1];
  10.     for(auto u : adj[v])    if(p - u)
  11.         dfs(u,v);
  12. }
  13.  
  14. // Query:
  15. int LCA(int v,int u){
  16.     if(h[v] < h[u])
  17.         swap(v,u);
  18.     for(int i = MAXLOG - 1;i >= 0;i --)
  19.         if(par[v][i] + 1 and h[par[v][i]] >= h[u])
  20.             v = par[v][i];
  21.     // now h[v] = h[u]
  22.     if(v == u)
  23.         return v;
  24.     for(int i = MAXLOG - 1;i >= 0;i --)
  25.         if(par[v][i] - par[u][i])
  26.             v = par[v][i], u = par[u][i];
  27.     return par[v][0];
  28. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement