Advertisement
Rentib

Untitled

Feb 10th, 2020
144
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.22 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. //ta wersja jest tak samo szybka jak na drzewie, jest w niej mniej pisania etc ale...
  4. //nie umiem tego wytłumaczyć
  5. vector<int> G[250007]; //graf
  6. int up[250007][20]; //binary jumpy
  7. int preorder[250007], postorder[250007], nr;
  8. void DFS(int v, int ojciec){
  9.   preorder[v] = ++nr;
  10.   up[v][0] = ojciec; //skok o 2^0 = 1 prowadzi do ojca
  11.   for(int i = 1;i < 20;i++)
  12.     up[v][i] = up[up[v][i - 1]][i - 1]; //jak zanasz skok o długości 2^(i - 1) oraz skok z wierzchołka do ktorego skoczysz to znasz dla 2^i
  13.   //mowilem ze nie umiem tlumaczyc
  14.   for(auto i : G[v])
  15.     if(preorder[i] == 0)
  16.       DFS(i, v);
  17.   postorder[v] = nr;
  18. }
  19. bool czy_przodek(int a, int b){
  20.   return preorder[a] <= preorder[b] && postorder[a] >= postorder[b];
  21. }
  22. int LCA(int a, int b){
  23.   if(czy_przodek(a, b))
  24.     return a;
  25.   if(czy_przodek(b, a))
  26.     return b;
  27.   for(int i = 19;i >= 0;i--)
  28.     if(!czy_przodek(up[a][i], b))
  29.       a = up[a][i];
  30.   return up[a][0];
  31. }
  32. int main(){
  33.   int n, m, a, b;
  34.   cin >> n;
  35.   for(int i = 1;i < n;i++){
  36.     cin >> a >> b;
  37.     G[a].push_back(b);
  38.     G[b].push_back(a);
  39.   }
  40.   DFS(1, 1);
  41.   for(cin >> m;m > 0;m--){
  42.     cin >> a >> b;
  43.     cout << LCA(a, b) << '\n';
  44.   }
  45. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement