※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 26935번 문제인 Släktträffen이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/26935
26935번: Släktträffen
På första raden i indata står talen $N$ och $M$ ($2 \le M \le N \le 20$). På andra raden står $N$ tal, föräldrarna för varje ättling (alla mellan $0$ och $N$). På tredje raden står $M$ tal, personerna runt bordet (alla mellan $1$ och $N$, utan d
www.acmicpc.net
이 문제는 주어지는 M개의 노드의 LCA(Lowest Common Ancestor)를 구하는 문제이다.
DFS를 이용한 트리DP를 이용해 각 노드를 루트로 하는 서브트리에 포함된 "M개의 노드에 포함되는 노드"의 개수를 구하고, 그 값이 M인 노드 중 가장 깊은 노드를 출력해 문제를 해결할 수 있다.
위와 같이 해결하지 않더라도 각 노드에서 DFS를 시도해 해당 노드를 루트로 하는 서브트리의 노드의 개수와 포함하는 "M개의 노드에 포함되는 노드"의 개수를 각각 구한 뒤, 포함하는 "M개의 노드에 포함되는 노드"가 M과 같은 서브트리 중 노드의 개수가 가장 적은 서브트리의 루트를 출력하는 것으로 문제를 해결할 수 있다.
아래는 제출한 소스코드이다.
#include <iostream>
#include <vector>
using namespace std;
int N, M;
vector<int> G[21];
int num[21];
bool chk = 1;
int dfs(int cur) {
int ret = num[cur];
for (auto& nxt : G[cur]) {
ret += dfs(nxt);
}
if (ret == M && chk) cout << cur, chk = 0;
return ret;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> N >> M;
for (int cur = 1; cur <= N; cur++) {
int par; cin >> par;
G[par].emplace_back(cur);
}
for (int m = 0; m < M; m++) {
int x; cin >> x;
num[x]++;
}
dfs(0);
}
'BOJ' 카테고리의 다른 글
[BOJ 15820 // C++] 맞았는데 왜 틀리죠? (0) | 2023.01.13 |
---|---|
[BOJ 1269 // C++] 대칭 차집합 (0) | 2023.01.12 |
[BOJ 26934 // C++] The Bus Card (0) | 2023.01.12 |
[BOJ 6602 // C++] Eeny Meeny Moo (0) | 2023.01.12 |
[BOJ 15828 // C++] Router (0) | 2023.01.12 |