Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- vector<int> G[250007]; //graf
- vector<int> ET; //wszystkie droga dfsa
- int preorder[250007], nr, normal_order[250007];
- int pierwsze_pojawienie[250007];
- void DFS(int v){
- preorder[v] = ++nr;
- normal_order[nr] = v;
- pierwsze_pojawienie[v] = ET.size();
- ET.push_back(v);
- for(auto i : G[v])
- if(preorder[i] == 0){
- DFS(i);
- ET.push_back(v);
- }
- }
- int LCA(int p, int k){
- p = pierwsze_pojawienie[p];
- k = pierwsze_pojawienie[k];
- int wynik = INT_MAX; // minimalna wartość
- //znajdz minimalną wartość ET na przedziale od p do k
- return normal_order[wynik];
- }
- 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);
- //ET to tablica na której musisz znajdywać minimalny wynik na przedziale
- for(cin >> m;m > 0;m--){
- cin >> a >> b;
- cout << LCA(a, b);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement