3584번 : 가장 가까운 공통 조상
문제)
루트가 있는 트리(rooted tree)가 주어지고, 그 트리 상의 두 정점이 주어질 때 그들의 가장 가까운 공통 조상(Nearest Common Anscestor)은 다음과 같이 정의됩니다.
- 두 노드의 가장 가까운 공통 조상은, 두 노드를 모두 자손으로 가지면서 깊이가 가장 깊은(즉 두 노드에 가장 가까운) 노드를 말합니다.
![](https://blog.kakaocdn.net/dn/EHWaj/btsrgjFPCD1/F4KdVxc043T56mkKkwHst1/img.png)
예를 들어 15와 11를 모두 자손으로 갖는 노드는 4와 8이 있지만, 그 중 깊이가 가장 깊은(15와 11에 가장 가까운) 노드는 4 이므로 가장 가까운 공통 조상은 4가 됩니다.
루트가 있는 트리가 주어지고, 두 노드가 주어질 때 그 두 노드의 가장 가까운 공통 조상을 찾는 프로그램을 작성하세요
입력 :
각 테스트 케이스 별로, 첫 줄에 입력에서 주어진 두 노드의 가장 가까운 공통 조상을 출력합니다.
출력 :
각 학기에 대해 근우의 총 학점과 평점(GPA)을 출력한다. 정답과의 절대 오차는 10-1까지 허용한다.
풀이)
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
#include <iostream>
#include <vector>
using namespace std;
int t, n;
int parent[10010];
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin >> t;
for (int _ = 0; _ < t; _++)
{
cin >> n;
// 다음 t를 위해 배열 초기화
fill(parent, parent + 10010, 0);
// 자식 노드로는 내려갈 필요가 없으므로.
// 부모 노드만 체크한다.
int a, b;
for (int i = 0; i < n - 1; i++)
{
cin >> a >> b;
parent[b] = a;
}
// 두 노드의 부모를 저장할 배열
vector<int> temp1;
vector<int> temp2;
int x, y;
cin >> x >> y;
// 두 노드의 부모 노드들을 각 배열에 저장한다.
while (x != 0)
{
temp1.push_back(x);
x = parent[x];
}
while (y != 0)
{
temp2.push_back(y);
y = parent[y];
}
// 맨 뒤 인덱스부터 두 배열이 달라지는 인덱스를 찾는다.
int idx1 = temp1.size() - 1;
int idx2 = temp2.size() - 1;
while (idx1 >= 0 && idx2 >= 0 && temp1[idx1] == temp2[idx2])
{
idx1--;
idx2--;
}
cout << temp1[idx1 + 1] << "\n";
}
return 0;
}
|
cs |
출처 : https://www.acmicpc.net/problem/3584
3584번: 가장 가까운 공통 조상
루트가 있는 트리(rooted tree)가 주어지고, 그 트리 상의 두 정점이 주어질 때 그들의 가장 가까운 공통 조상(Nearest Common Anscestor)은 다음과 같이 정의됩니다. 두 노드의 가장 가까운 공통 조상은, 두
www.acmicpc.net
'Develop > 백준 (Cpp)' 카테고리의 다른 글
[백준] 1967번 : 트리의 지름 (C++) (0) | 2023.08.15 |
---|---|
[백준] 11437번 : LCA (C++) (0) | 2023.08.15 |
[백준] 15681번 : 트리와 쿼리 (C++) (0) | 2023.08.14 |
[백준] 17484번 : 진우의 달 여행 (Small) (C++) (0) | 2023.08.11 |
[백준] 1789번 : 수들의 합 (C++) (0) | 2023.08.10 |