Henu
개발냥발
Henu
전체 방문자
오늘
어제
  • 분류 전체보기 (411)
    • DevOps (52)
      • Kubernetes (19)
      • Docker (14)
      • AWS (3)
      • Nginx (4)
      • Linux (4)
      • ArgoCD (1)
      • CN (2)
      • NATS (0)
      • Git (5)
    • Back-End (30)
      • Django (18)
      • Spring (5)
      • JPA (1)
      • MSA (5)
    • CS (87)
      • SystemSoftware (20)
      • OS (25)
      • Computer Architecture (16)
      • Network (23)
      • Database (2)
    • Lang (21)
      • Java (9)
      • Python (4)
      • C# (8)
    • Life (12)
    • 블록체인 (2)
    • Algorithm (204)
      • BOJ (160)
      • 프로그래머스 (19)
      • LeetCode (4)
      • SWEA (1)
      • 알고리즘 문제 해결 전략 (8)
      • DS, algorithms (7)
      • Checkio (5)
    • IT (2)

블로그 메뉴

  • GitHub
  • 글쓰기
  • 관리자

공지사항

  • Free!

인기 글

태그

  • Network
  • docker
  • BFS
  • boj
  • 다이나믹 프로그래밍
  • 백트래킹
  • DFS
  • django
  • 프로그래머스
  • Kubernetes

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Henu

개발냥발

[백준 15681] 트리와 쿼리 C++
Algorithm/BOJ

[백준 15681] 트리와 쿼리 C++

2021. 5. 5. 23:40
 

15681번: 트리와 쿼리

트리의 정점의 수 N과 루트의 번호 R, 쿼리의 수 Q가 주어진다. (2 ≤ N ≤ 105, 1 ≤ R ≤ N, 1 ≤ Q ≤ 105) 이어 N-1줄에 걸쳐, U V의 형태로 트리에 속한 간선의 정보가 주어진다. (1 ≤ U, V ≤ N, U ≠ V)

www.acmicpc.net

트리에서의 다이나믹 프로그래밍 입문 #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;
}
Colored by Color Scripter
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
    'Algorithm/BOJ' 카테고리의 다른 글
    • [백준 2533] 사회망 서비스(SNS) C++
    • [백준 1949] 우수 마을 C++
    • [백준 2602] 돌다리 건너기 C++
    • [백준 9466] 텀프로젝트 C++

    티스토리툴바