-
BOJ 15681: 트리와 쿼리알고리즘 2023. 7. 23. 22:33
#BOJ 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
#풀이
트리의 루트노드를 알려주고 서브트리의 정점의 개수를 구하는 문제이다.
맨 처음엔 BFS를 사용하여 정점을 입력 받을 때 마다 직접 구했는데 시간초과가 떠서
DFS를 이용하여 서브 트리의 개수를 구할 수 있었다.
재귀를 이용하여 DFS를 하면 쉽게 서브트리의 정점의 개수를 구할 수 있다.
#코드
#include<iostream> #include<vector> using namespace std; int n, r, q; vector<int>adj[100001]; int prt[100001]; int subTree[100001]; bool vis[100001]; int dfs(int cur) { vis[cur] = 1; for (auto nxt : adj[cur]) { if (vis[nxt] == 1) continue; subTree[cur] += dfs(nxt); } subTree[cur]++; return subTree[cur]; } int main() { ios::sync_with_stdio(0); cin.tie(0); cin >> n >> r >> q; prt[r] = -1; for (int i = 1; i < n; i++) { int num1, num2; cin >> num1 >> num2; adj[num1].push_back(num2); adj[num2].push_back(num1); } dfs(r); for (int i = 0; i < q; i++) { int U; cin >> U; cout << subTree[U] << '\n'; } return 0; }
'알고리즘' 카테고리의 다른 글
BOJ 20955: 민서의 응급 수술 (1) 2023.07.23 BOJ 1240: 노드사이의 거리 (0) 2023.07.23 BOJ 4803: 트리 (0) 2023.07.23 BOJ 1043: 거짓말 (0) 2023.07.23 BOJ 2617 : 구슬 찾기 (0) 2023.07.23