트리에서의 다이나믹 프로그래밍 입문 #1
R이 트리의 기본 루트일 때 정점 U를 루트로 하는 Subtree에 속한 정점의 수를 출력
문제 이해를 위한 설명!
트리의 기본 루트는 5이다
사진에서 4를 루트로 하는 서브트리는 아래와 같다
그림과 같이 4를 루트로하는 서브트리의 정점은 1, 2, 3, 4 이다 (자신도 서브트리에 물론 포함)
트리의 리프노드 까지 가면 dp[now]를 반환한다(dp[i]의 초기값은 모두 1)
dp[now] 는 now노드와 연결된 자식노드들의 개수가 되도록
dp[now] += dfs(next); 코드를 작성해준다
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
|
#include <bits/stdc++.h>
using namespace std;
int N, R, Q;
vector<int> query, tree[100001];
bool visited[100001];
int dp[100001];
int dfs(int now){
visited[now] = true;
for(int i = 0; i < tree[now].size(); i++){
int next = tree[now][i];
if(visited[next]) continue;
dp[now] += dfs(next);
}
return dp[now];
}
void input(){
int u, v, q;
cin >> N >> R >> Q;
for(int i = 0; i < N-1; i++){
cin >> u >> v;
tree[u].push_back(v);
tree[v].push_back(u);
}
for(int i = 0; i < Q; i++){
cin >> q;
query.push_back(q);
}
for(int i = 0; i <= N; i++){
dp[i] = 1;
}
}
int main(){
input();
dfs(R);
for(auto w : query){
cout << dp[w] << "\n";
}
return 0;
}
|
cs |
DFS, 양방향 트리, DP의 가장 기본적인 성질들이 섞인 문제
'Algorithm > BOJ' 카테고리의 다른 글
[백준 2533] 사회망 서비스(SNS) C++ (0) | 2021.05.06 |
---|---|
[백준 1949] 우수 마을 C++ (2) | 2021.05.06 |
[백준 2602] 돌다리 건너기 C++ (1) | 2021.05.05 |
[백준 9466] 텀프로젝트 C++ (0) | 2021.05.05 |
[백준 1937] 욕심쟁이 판다 C++ (0) | 2021.05.01 |