728x90
반응형
https://www.acmicpc.net/problem/15681
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
#include <iostream>
#include <vector>
#define MAX 100001
using namespace std;
int dp[MAX];
vector<int> vec[MAX];
bool visited[MAX];
void dfs(int node, int parent){
visited[node] = true;
for(int i = 0; i < vec[node].size(); i++){
int next = vec[node][i];
if(!visited[next])
dfs(next, node);
}
if(parent != -1){
dp[parent] += dp[node];
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
int n, r, q;
cin >> n >> r >> q;
for(int i = 0; i < n + 1; i++)
dp[i] = 1;
for(int i = 0; i < n - 1; i++){
int u, v;
cin >> u >> v;
vec[u].push_back(v);
vec[v].push_back(u);
}
dfs(r, -1);
for(int i = 0; i < q; i++){
int u;
cin >> u;
cout << dp[u] << endl;
}
return 0;
}
DFS + DP를 이용한 메모아이징을 사용한다.
리프 노드는 자식이 없으므로 서브 트리의 정점 개수는 자기 자신 1개이다. 따라서 dp 배열을 1로 초기화한다.
루트 노드부터 dfs를 실행하고, 서브 트리 탐색이 끝났다면 부모에게 자신의 서브 트리 개수를 더해준다.
(부모가 -1인 경우는 루트 노드이므로 더하지 않는다.)
아래 예제에서 파란색으로 적은 숫자는 정점에서의 서브 트리 정점 개수이다.
728x90
반응형
'Algorithm > BAEKJOON' 카테고리의 다른 글
[BOJ] 7569번 토마토 (C++) (0) | 2022.08.11 |
---|---|
[BOJ] 1374번 강의실 (C++) (0) | 2022.08.09 |
[BOJ] 1245번 농장 관리 (C++) (0) | 2022.08.07 |
[BOJ] 23793번 두 단계 최단 경로 1 (C++) (0) | 2022.08.06 |
[BOJ] 1238번 파티 (C++) (0) | 2022.08.05 |