Advertisement
Rentib

Untitled

Feb 10th, 2020
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.95 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. vector<int> G[250007]; //graf
  4. vector<int> ET; //wszystkie droga dfsa
  5. int preorder[250007], nr, normal_order[250007];
  6. int pierwsze_pojawienie[250007];
  7. void DFS(int v){
  8.   preorder[v] = ++nr;
  9.   normal_order[nr] = v;
  10.   pierwsze_pojawienie[v] = ET.size();
  11.   ET.push_back(v);
  12.   for(auto i : G[v])
  13.     if(preorder[i] == 0){
  14.       DFS(i);
  15.       ET.push_back(v);
  16.     }
  17. }
  18. int LCA(int p, int k){
  19.   p = pierwsze_pojawienie[p];
  20.   k = pierwsze_pojawienie[k];
  21.   int wynik = INT_MAX; // minimalna wartość
  22.  
  23.   //znajdz minimalną wartość ET na przedziale od p do k
  24.  
  25.   return normal_order[wynik];
  26. }
  27. int main(){
  28.   int n, m, a, b;
  29.   cin >> n;
  30.   for(int i = 1;i < n;i++){
  31.     cin >> a >> b;
  32.     G[a].push_back(b);
  33.     G[b].push_back(a);
  34.   }
  35.   DFS(1);
  36.   //ET to tablica na której musisz znajdywać minimalny wynik na przedziale
  37.   for(cin >> m;m > 0;m--){
  38.     cin >> a >> b;
  39.     cout << LCA(a, b);
  40.   }
  41. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement