yungyao

lca

Jun 3rd, 2021 (edited)
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.07 KB | None | 0 0
  1. void dfs(int x,int fr,LL fw){ //start with dfs(1,0,0) if vertex is 1-base
  2.     if (fr){
  3.         dep[x] = dep[fr] + 1;
  4.         anc[x][0] = make_pair(fr,fw);
  5.         for (int i=1;i<=__lg(dep[x]);++i){
  6.             int i_anc = anc[x][i-1].F;
  7.             anc[x][i] = make_pair(anc[i_anc][i-1].F,max(anc[i_anc][i-1].S,anc[x][i-1].S));
  8.         }
  9.     }
  10.  
  11.     for (auto [t,w]:tree[x]){
  12.         if (t != fr)
  13.             dfs(t,x,w);
  14.     }
  15. }
  16.  
  17. LL lca(int u,int v){
  18.     LL ret = 0;
  19.     if (dep[v] > dep[u])
  20.         swap(u,v);
  21.     if (dep[u] > dep[v]){
  22.         int k = dep[u] - dep[v];
  23.         for (int i=0;i<=__lg(k);++i){
  24.             if ((1 << i) & k){
  25.                 ret = max(ret,anc[u][i].S);
  26.                 u = anc[u][i].F;
  27.             }
  28.         }
  29.     }
  30.     if (u == v)
  31.         return ret;
  32.  
  33.     for (int i=__lg(dep[u]);i>=0;--i){
  34.         if (anc[u][i].F != anc[v][i].F){
  35.             ret = max(ret,max(anc[u][i].S,anc[v][i].S));
  36.             u = anc[u][i].F;
  37.             v = anc[v][i].F;
  38.         }
  39.     }
  40.     ret = max(ret,max(anc[u][0].S,anc[v][0].S));
  41.  
  42.     return ret;
  43. }
Add Comment
Please, Sign In to add comment