vedhant

Untitled

Apr 12th, 2020
1,703
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.65 KB | None | 0 0
  1. void dfs(int u, int p) {
  2.     lvl[u] = lvl[p] + 1;
  3.     dp[u][0] = p;
  4.     for(int i=1; i<LN; ++i)
  5.         dp[u][i] = dp[dp[u][i-1]][i-1];
  6.     for(int i=0; i<adj[u].size(); ++i) {
  7.         int v = adj[u][i];
  8.         if(v == p) continue;
  9.         dfs(v, u);
  10.     }
  11. }
  12.  
  13. int lca(int u, int v) {
  14.     if(lvl[u] < lvl[v])
  15.         swap(u, v);
  16.     int diff = lvl[u] - lvl[v];
  17.     for(int i=0; i<LN; ++i) {
  18.         if((1<<i) & diff)
  19.             u = dp[u][i];
  20.     }
  21.     if(u == v)
  22.         return u;
  23.     for(int i=LN-1; i>=0; --i) {
  24.         if(dp[u][i] != dp[v][i]) {
  25.             u = dp[u][i];
  26.             v = dp[v][i];
  27.         }
  28.     }
  29.     return dp[u][0];
  30. }
Add Comment
Please, Sign In to add comment