본문 바로가기

백준/골드

[백준 3584번] 가장 가까운 공통 조상 (C++)

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

 

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

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

www.acmicpc.net

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int MAX = 987654321;

int T, N, A, B, X, Y;
int parent[10001];
int visited[10001];

int dfs(int n)
{
    if(visited[n]) return n; //방문체크
    return dfs(parent[n]); //부모찾기
}

int main()
{
    ios_base::sync_with_stdio(0); 
	cin.tie(0);

    cin >> T;
    while(T--)
    {
        memset(parent, 0 , sizeof(parent)); //테스트케이스마다 초기화
        memset(visited, 0, sizeof(visited));
        cin >> N;
        for(int i=0; i<N-1; i++)
        {
            cin >> A >> B;
            parent[B]=A; //B의 부모는 A
        }
        cin >> X >> Y;
        while(X) //X기준 조상 노드들 방문 처리
        {
            visited[X]=1;
            X=parent[X];
        }
        cout << dfs(Y) << "\n"; //A 부모 탐색 중 이미 방문된 값 있으면 해당 값 출력
    }
}

이번 문제로 최소 공통 조상 문제에 대해 처음 접하게되었다.

줄여서 LCA라고 알고리즘이 따로 있는 듯 했지만 해당 문제는 LCA 알고리즘까지는 필요없이 다소 간단하게 풀 수 있는 것 같았다.

 

먼저 공통 조상을 구할 첫 번째 노드인 X를 기준으로 X 위로 조상 노드들을 모두 방문처리 시켜준다.

그리고 두 번째 노드인 Y를 기준으로 조상 노드들을 찾기 시작하는데 이미 X를 기준으로 탐색해주면서 방문처리를 했던 값이라면 해당 값을 반환시켜준다.

지금 방문하는데 전에 이미 방문했다는 것은 공통되는 조상 노드라는 것을 의미하기 때문이다.

 

X : 16
16 -> 10 -> 4 -> 8

Y : 7
7 -> 6 -> 4 -> 8

가장 먼저 겹치는 조상 노드 : 4

 

'백준 > 골드' 카테고리의 다른 글

[백준 11812번] K진 트리 (C++)  (0) 2023.10.31
[백준 11437번] LCA (C++)  (0) 2023.10.30
[백준 1240번] 노드사이의 거리 (C++)  (0) 2023.10.26
[백준 3067번] Coins (C++)  (0) 2023.10.25
[백준 1068번] 트리 (C++)  (0) 2023.10.24