코테풀이/백준

15681번: 트리와 쿼리

miimu 2025. 10. 2. 14:10

https://www.acmicpc.net/problem/15681

 

임의의 루트가 있는 트리가 에서, 입력 U를 루트로 하는 서브트리의 노드 개수를 구하는 문제이다.

 

아이디어

DFS recursion으로 leaf에 도달했을 때, leaf node의 서브 트리의 노드개수는 1

그리고 leaf의 부모 노드로 돌아가면 자식 노드들 개수를 본인 노드 개수와 합친다.

 

# https://www.acmicpc.net/problem/15681
# Tree, DP

import sys
from collections import defaultdict, deque

sys.setrecursionlimit(10**6)

N, R, Q = map(int, sys.stdin.readline().split())
tree = defaultdict(list)
for _ in range(N-1) :
    u, v = map(int, sys.stdin.readline().split())
    tree[u].append(v)
    tree[v].append(u)

subtree = [0] * (N+1)
visited = [0] * (N+1)

def DFS(node) :
    if visited[node] != 0 :
        return

    visited[node] = 1

    for l in tree[node] :
        if visited[l] :
            continue

        DFS(l)
        subtree[l] += 1

        subtree[node] += subtree[l]

subtree[R] = 1
DFS(R)

for _ in range(Q) :
    u = list(map(int, sys.stdin.readline().split()))[0]
    print(subtree[u])

 

subtree[l] += 1로 본인 노드 개수를 세고

subtree[node] += subtree[l]로 자식 노드 총 수를 더한다.

 

 

본래는 parents list를 따로 구현해서 subtree에 저장하는 방식이었는데,

정점 개수가 많아질 수록 O(N)만큼 시간이 더 걸려서 시간초과가 떴다.

그래서 recursion을 적극적으로 이용하는 방식으로 아이디어를 다시 짰다.

 

'코테풀이 > 백준' 카테고리의 다른 글

11725번: 트리의 부모 찾기  (0) 2025.10.13
14725번: 개미굴  (0) 2025.10.10
2533번: 사회망 서비스(SNS)  (0) 2025.10.01
7569번: 토마토  (0) 2025.09.24
10026번: 적록색약  (1) 2025.09.15