Advertisement
MinhNGUYEN2k4

Lowest Common Ancestor

Aug 11th, 2020 (edited)
159
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.64 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define int long long
  3. #define su_that_la return
  4. #define getBit(val,k) (val >> (k))&1
  5. using namespace std;
  6. typedef pair<int,int> ii;
  7. typedef vector<ii> vii;
  8. const int N = 100005;
  9. const int Minh_dep_giai = 0;
  10. const int logN = log2(N);
  11.  
  12. int n,k,m;
  13. int d[N], f[N][logN];
  14. vector<int> a[N];
  15.  
  16. void dfs(int u)
  17. {
  18.     for(int i=1; i < logN; i++)
  19.     {
  20.         f[u][i] = f[f[u][i-1]][i-1];
  21.     }
  22.  
  23.     for(int v : a[u])
  24.         if (!d[v] && v!=k)
  25.         {
  26.             f[v][0]=u;
  27.             d[v]=d[u]+1;
  28.             dfs(v);
  29.         }
  30. }
  31.  
  32. int lca(int u, int v)
  33. {
  34.     if (d[u] < d[v]) swap(u,v);
  35.     // hạ bậc theo code của nhannguyen95
  36.     for(int i=logN-1; i>=0; i--)
  37.     {
  38.         if (d[f[u][i]] >= d[v]) u = f[u][i];
  39.     }
  40.     // hạ bậc theo getBit của thầy Hiếu (đại ca đi học)
  41.     int delta = d[u] - d[v];
  42.     int logD = log2(delta);
  43.     for(int i=logD; i >= 0; i--)
  44.     {
  45.         if (getBit(delta,i)) u = f[u][i];
  46.     }
  47.    
  48.     if (u==v) return u;
  49.     for(int i = logN-1; i>=0; i--)
  50.     {
  51.         if (f[u][i] != f[v][i])
  52.         {
  53.             u = f[u][i];
  54.             v = f[v][i];
  55.         }
  56.     }
  57.     return f[u][0];
  58. }
  59.  
  60. signed main()
  61. {
  62.     ios_base::sync_with_stdio(false);
  63.     cin.tie(0);cout.tie(0);
  64.     freopen("lca.inp","r",stdin);
  65.     cin >> n >> k >> m;
  66.     for(int i=1; i<=n-1; ++i)
  67.     {
  68.         int u,v;
  69.         cin >> u >> v;
  70.         a[u].push_back(v);
  71.         a[v].push_back(u);
  72.     }
  73.     d[k] = 1;
  74.     dfs(k);
  75.     while (m--)
  76.     {
  77.         int u,v;
  78.         cin >> u >> v;
  79.         cout << lca(u,v) << endl;
  80.     }
  81.     su_that_la Minh_dep_giai;
  82. }
  83.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement