BotByte

LCA.cpp

Mar 23rd, 2018
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.26 KB | None | 0 0
  1. /*** Lowest Common Ancestor ***/
  2.  
  3. #include <bits/stdc++.h>
  4.  
  5. using namespace std;
  6.  
  7. #define MAX 1005
  8. #define MAXLOG 16
  9. vector<int> adj[MAX];
  10. bool vis[MAX];
  11. int level[MAX], P[MAX][MAXLOG], n, parent[MAX];
  12.  
  13. void take_input()
  14. {
  15.     for(int i=0; i<MAX; i++) adj[i].clear();
  16.     scanf("%d", &n);
  17.     for(int i=1; i<=n; i++){
  18.         int num;
  19.         scanf("%d", &num);
  20.         for(int j=1; j<=num; j++){
  21.             int x;
  22.             scanf("%d", &x);
  23.             adj[i].push_back(x);
  24.             adj[x].push_back(i);
  25.         }
  26.     }
  27. }
  28.  
  29. void bfs(int root)
  30. {
  31.     memset(vis, false, sizeof vis);
  32.     level[root] = 0;
  33.     vis[root] = true;
  34.     parent[root] = -1;
  35.     queue<int> Q;
  36.     Q.push(root);
  37.     while(!Q.empty()){
  38.         int u = Q.front();
  39.         Q.pop();
  40.         for(int i=0; i<adj[u].size(); i++){
  41.             int v = adj[u][i];
  42.             if(vis[v] == false){
  43.                 vis[v] = true;
  44.                 level[v] = level[u] + 1;
  45.                 parent[v] = u;
  46.                 Q.push(v);
  47.             }
  48.         }
  49.     }
  50. }
  51.  
  52. void preprocess()
  53. {
  54.     for(int i=1; i<=n; i++){
  55.         for(int j=0; j<MAXLOG; j++) P[i][j] = -1;
  56.     }
  57.     for(int i=1; i<=n; i++) P[i][0] = parent[i];
  58.     for(int j=1; j<MAXLOG; j++){
  59.         for(int i=1; i<=n; i++){
  60.             if(P[i][j-1] != -1){
  61.                 P[i][j] = P[P[i][j-1]][j-1];
  62.             }
  63.         }
  64.     }
  65. }
  66.  
  67. int findLCA(int u, int v)
  68. {
  69.     if(level[u] < level[v]) swap(u, v);
  70.     int dist = level[u] - level[v];
  71.     while(dist > 0){
  72.         int raise_by = log2(dist);
  73.         u = P[u][raise_by];
  74.         dist -= (1<<raise_by);
  75.     }
  76.     if(u == v) return u;
  77.     for(int j=MAXLOG-1; j>=0; j--){
  78.         if(P[u][j] != -1 && (P[u][j] != P[v][j])){
  79.             u = P[u][j];
  80.             v = P[v][j];
  81.         }
  82.     }
  83.     return parent[u];
  84. }
  85.  
  86. int main()
  87. {
  88.     //freopen("in.txt", "r", stdin);
  89.     int cases;
  90.     scanf("%d", &cases);
  91.     int caseno = 0;
  92.     while(cases--){
  93.         take_input();
  94.         bfs(1);
  95.         preprocess();
  96.         printf("Case %d:\n", ++caseno);
  97.         int q;
  98.         scanf("%d", &q);
  99.         for(int i=0; i<q; i++){
  100.             int u, v;
  101.             scanf("%d %d", &u, &v);
  102.             printf("%d\n", findLCA(u, v));
  103.         }
  104.     }
  105. }
Advertisement
Add Comment
Please, Sign In to add comment