Advertisement
cosenza987

lca

Apr 18th, 2022
826
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.68 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. int t, n, l, q;
  6. vector<vector<int>> adj, up;
  7. vector<int> tin, tout, h;
  8.  
  9. void dfs(int v, int p = 1, int hh = 0) {
  10.     tin[v] = ++t;
  11.     up[v][0] = p;
  12.     for(int i = 1; i <= l; i++) {
  13.         up[v][i] = up[up[v][i - 1]][i - 1];
  14.     }
  15.     for(auto u : adj[v]) {
  16.         if(u != p) {
  17.             dfs(u, v, hh + 1);
  18.         }
  19.     }
  20.     h[v] = hh;
  21.     tout[v] = ++t;
  22. }
  23.  
  24. bool isanc(int u, int v) {
  25.     return tin[u] <= tin[v] and tout[u] >= tout[v];
  26. }
  27.  
  28. int lca(int u, int v) {
  29.     if(isanc(u, v)) {
  30.         return u;
  31.     }
  32.     if(isanc(v, u)) {
  33.         return v;
  34.     }
  35.     for(int i = l; i >= 0; i--) {
  36.         if(!isanc(up[u][i], v)) {
  37.             u = up[u][i];
  38.         }
  39.     }
  40.     return up[u][0];
  41. }
  42.  
  43. int main() {
  44.     ios_base::sync_with_stdio(false);
  45.     cin.tie(0);
  46.     int tt;
  47.     cin >> tt;
  48.     for(int ii = 1; ii <= tt; ii++) {
  49.         cout << "Case " << ii << ":\n";
  50.         t = 0;
  51.         int n;
  52.         cin >> n;
  53.         tin.clear(); tin.resize(n + 1);
  54.         tout.clear(); tout.resize(n + 1);
  55.         h.clear(); h.resize(n + 1);
  56.         adj.clear(); adj.resize(n + 1);
  57.         l = ceil(log2(n + 1)) + 1;
  58.         up.clear(); up.assign(n + 1, vector<int>(l + 1));
  59.         for(int i = 1; i <= n; i++) {
  60.             int x;
  61.             cin >> x;
  62.             while(x--) {
  63.                 int u;
  64.                 cin >> u;
  65.                 adj[i].push_back(u);
  66.                 adj[u].push_back(i);
  67.             }
  68.         }
  69.         dfs(1);
  70.         cin >> q;
  71.         while(q--) {
  72.             int u, v;
  73.             cin >> u >> v;
  74.             cout << lca(u, v) << "\n";
  75.         }
  76.     }
  77.     return 0;
  78. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement