티스토리 뷰

문제 링크입니다 : https://www.acmicpc.net/problem/3584

 

3584번: 가장 가까운 공통 조상

문제 루트가 있는 트리(rooted tree)가 주어지고, 그 트리 상의 두 정점이 주어질 때 그들의 가장 가까운 공통 조상(Nearest Common Anscestor)은 다음과 같이 정의됩니다. 두 노드의 가장 가까운 공통 조상�

www.acmicpc.net

 

 

시간 복잡도가 O(N)인 방법이다. RMQ로 구현하면 O(logN)으로 구현할 수 있다. 다음 문제들에서는 RMQ로 풀어봐야겠다.

 

 

 

#include <iostream>
#include <vector>

using namespace std;
int T, N;

vector<vector<int>> adj;
vector<int> parent;
vector<int> depth;

void dfs(int here, int d) {
    depth[here] = d;

    for(int i = 0; i < adj[here].size(); i++) {
        int next = adj[here][i];
        dfs(next, d + 1);
    }
}


int main() {
    cin >> T;
    while(T--) {
        cin >> N;
        adj.assign(N + 1, vector<int>());
        parent.assign(N + 1, 0);
        depth.assign(N + 1, 0);

        int u, v;
        for(int i = 0; i < N - 1; i++) {
            cin >> u >> v;
            adj[u].push_back(v);
            parent[v] = u;
        }

        int root = 0;
        for(int i = 1; i <= N; i++) {
            if(!parent[i]) {
                root = i;
                break;
            }
        }

        dfs(root, 0);


        int a, b;
        cin >> a >> b;

        while(depth[a] != depth[b]) {
            if(depth[a] < depth[b]) {
                b = parent[b];
            } else {
                a = parent[a];
            }
        }
        while(a != b) {
            a = parent[a];
            b = parent[b];
        }
        cout << a << '\n';


    }


    return 0;
}

 

 

 

개발 환경 : vscode

지적, 조언, 질문 환영입니다! 댓글 남겨주세요~

 

'알고리즘 > 백준(BOJ)' 카테고리의 다른 글

백준 - 2150 Strongly Connected Component  (0) 2020.07.27
백준 - 11437 LCA  (0) 2020.07.23
백준 - 1005 ACM Craft  (0) 2020.07.19
백준 - 14425 문자열 집합  (0) 2020.07.19
백준 - 14725 개미굴  (0) 2020.07.19
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함