Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- //ta wersja jest tak samo szybka jak na drzewie, jest w niej mniej pisania etc ale...
- //nie umiem tego wytłumaczyć
- vector<int> G[250007]; //graf
- int up[250007][20]; //binary jumpy
- int preorder[250007], postorder[250007], nr;
- void DFS(int v, int ojciec){
- preorder[v] = ++nr;
- up[v][0] = ojciec; //skok o 2^0 = 1 prowadzi do ojca
- for(int i = 1;i < 20;i++)
- 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
- //mowilem ze nie umiem tlumaczyc
- for(auto i : G[v])
- if(preorder[i] == 0)
- DFS(i, v);
- postorder[v] = nr;
- }
- bool czy_przodek(int a, int b){
- return preorder[a] <= preorder[b] && postorder[a] >= postorder[b];
- }
- int LCA(int a, int b){
- if(czy_przodek(a, b))
- return a;
- if(czy_przodek(b, a))
- return b;
- for(int i = 19;i >= 0;i--)
- if(!czy_przodek(up[a][i], b))
- a = up[a][i];
- return up[a][0];
- }
- int main(){
- int n, m, a, b;
- cin >> n;
- for(int i = 1;i < n;i++){
- cin >> a >> b;
- G[a].push_back(b);
- G[b].push_back(a);
- }
- DFS(1, 1);
- for(cin >> m;m > 0;m--){
- cin >> a >> b;
- cout << LCA(a, b) << '\n';
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement