nrk009

LCA USING BINARY LIFTING

Aug 1st, 2019
235
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.79 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define fast ios_base::sync_with_stdio(0);cin.tie(NULL);cout.tie(NULL)
  5. #define ll long long
  6. #define ld long double
  7. #define pb push_back
  8. #define fe first
  9. #define se second
  10. #define nl "\n"
  11. #define pp pair < ll , ll >
  12. #define sz(x) (ll)x.size()
  13. #define st(x) sort(x.begin(),x.end())
  14. #define rst(x) sort(x.rbegin(), x.rend())
  15. #define all(x) x.begin(),x.end()
  16. long double pi = 3.14159265358979323;
  17.  
  18. const double EPS = 1e-12;
  19. const int N = 1e3 + 1;
  20. const int mod = 1e9 + 7;
  21.  
  22. vector < ll > v[N];
  23. ll level[N],dp[N][11],l;
  24. bool vis[N];
  25.  
  26. void dfs(ll u , ll p){
  27.  
  28.     vis[u] = 1;
  29.     dp[u][0] = p;
  30.     for(int i = 1 ; i <= l ;i++ )
  31.         dp[u][i] = dp[dp[u][i-1]][i-1];
  32.     for(auto it : v[u]){
  33.         if(!vis[it]){
  34.             level[it] = level[u] + 1;
  35.             dfs(it,u);
  36.         }
  37.     }
  38. }
  39. ll lca(ll u , ll v){
  40.     if(level[u] < level[v])
  41.         swap(u,v);
  42.     ll diff = log2(level[u] - level[v]);
  43.     for(int i = diff ; i >= 0 ; i-- ){
  44.         if(level[u] != level[v])
  45.             u = dp[u][i];
  46.     }
  47.     if(u == v)return u;
  48.     diff = log2(level[v]);
  49.     for(int i = diff ; i >= 0 ; i-- ){
  50.         if(dp[u][i] != dp[v][i]){
  51.             u = dp[u][i];
  52.             v = dp[v][i];
  53.         }
  54.     }
  55.     return dp[u][0];
  56. }
  57. int main()
  58. {
  59.     fast;
  60.     ll t;
  61.     cin >> t ;
  62.   for(int i = 1 ; i  <= t ; i++ ){
  63.         ll n;
  64.         cin >> n ;
  65.         l = log2(n);
  66.         for(int i = 1 ; i  <= n ;  i++ ){
  67.             ll m;
  68.             cin >> m;
  69.             while(m--){
  70.                 ll x;
  71.                 cin >> x ;
  72.                 v[i].pb(x);
  73.                 v[x].pb(i);
  74.             }
  75.         }
  76.         dfs(1,1);
  77.         ll q;
  78.         cin >> q ;
  79.         cout << "Case " << i << ":\n";
  80.         while(q--){
  81.             ll x , y;
  82.             cin >> x >> y ;
  83.             cout << lca(x,y) << "\n";
  84.         }
  85.         for(int i = 1 ; i  <= n ; i++ ){
  86.             v[i].clear();
  87.             vis[i] = 0 ;
  88.             level[i] = 0 ;
  89.             for(int j = 0  ; j < 11  ; j++ )
  90.                 dp[i][j]  = 0 ;
  91.         }
  92.  
  93.     }
  94.  
  95.  
  96.  
  97.  
  98.  
  99.  
  100.  
  101.  
  102.  
  103.  
  104.  
  105.  
  106.  
  107.  
  108.  
  109.  
  110.  
  111.  
  112.  
  113.  
  114.    
  115.     return 0;
  116.         }
Advertisement
Add Comment
Please, Sign In to add comment