Tarango

LCA

Sep 4th, 2015
213
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.47 KB | None | 0 0
  1. //LCA:Lowest Common Anchester:
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4. #define Size 100005
  5.  
  6. vector<int> Graph[Size];
  7. vector< vector<int> > sparseTable;
  8. vector<int> discTime,finishTime;
  9. int u,v,N,Query,edge;
  10. int Time = 0,level = 0;
  11.  
  12. void DFS(int cur,int prev){
  13.     discTime[cur] = ++Time;
  14.     sparseTable[cur][0] = prev;
  15.     for(int c = 1;c<=level;c++){
  16.         sparseTable[cur][c] = sparseTable[sparseTable[cur][c-1]][c-1];
  17.     }
  18.     for(int i = 0;i<(int)Graph[cur].size();i++){
  19.         int adj = Graph[cur][i];
  20.         if(adj != prev){
  21.             DFS(adj,cur);
  22.         }
  23.     }
  24.     finishTime[cur] = ++Time;
  25. }
  26.  
  27. bool isUpper(int u,int v){
  28.     return (discTime[u] <= discTime[v]) && (finishTime[u] >= finishTime[v]);
  29. }
  30.  
  31. void process(){
  32.     sparseTable.resize(N);
  33.     discTime.resize(N);
  34.     finishTime.resize(N);
  35.     level = 1,Time = 0;
  36.     while((1<<level) <= N){
  37.         level++;
  38.     }
  39.     for(int i = 0;i<N;i++){
  40.         sparseTable[i].resize(level+1);
  41.     }
  42.     DFS(0,0);
  43. }
  44.  
  45. int LCA(int n1,int n2){
  46.     if(isUpper(n1,n2)) return n1;
  47.     if(isUpper(n2,n1)) return n2;
  48.     for(int c = level;c>=0;c--){
  49.         if(!isUpper(sparseTable[n1][c],n2)){
  50.             n1 = sparseTable[n1][c];
  51.         }
  52.     }
  53.     return sparseTable[n1][0];
  54. }
  55.  
  56. int main() {
  57.     scanf("%d %d",&N,&edge);
  58.     for(int i = 0;i<edge;i++){
  59.         scanf("%d %d",&u,&v);
  60.         Graph[u].push_back(v);
  61.         Graph[v].push_back(u);
  62.     }
  63.     process();
  64.     scanf("%d",&Query);
  65.     for(int i = 0;i<Query;i++){
  66.         scanf("%d %d",&u,&v);
  67.         int lca = LCA(u,v);
  68.         printf("LCA of node %d and node %d = %d\n",u,v,lca);
  69.     }
  70.     return 0;
  71. }
Advertisement
Add Comment
Please, Sign In to add comment