Python/백준

15681_트리와쿼리

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

 

 

 

트리 구조를 받아온 후에, dfs로 노드를 후위순위하면서 뒤에서부터 서브트리의 개수를 더해주면 된다.

 

각 자식트리의 서브트리를 더해주는 형태라고 생각하면 된다.

 

처음에 bfs를 사용해서 그때 그때 개수를 구했는데그러며 시간초과가 나니 생각해두면 될 것 같다.

 

import sys
from collections import deque
sys.setrecursionlimit(10**5)
input = sys.stdin.readline

n,r,Q = map(int,input().split())
graph = [ [] for _ in range(n+1) ]
for _ in range(n-1):
    u,v = map(int,input().split())
    graph[u].append(v)
    graph[v].append(u)

def cnt(node):
    count[node] = 1
    for i in graph[node]:
        if not count[i]:
            cnt(i)
            count[node] += count[i]

count = [0] * (n+1)
cnt(r)
for _ in range(Q):
    print(count[int(input())])


 

728x90

'Python > 백준' 카테고리의 다른 글

2533_사회망서비스 (메모리초과,재귀오류?)  (0) 2022.05.18
2213_트리의 독립집합  (0) 2022.05.18
17472_다리만들기2(Python,설명) 반례...?  (0) 2022.05.17
1774_우주신과의 교감  (0) 2022.05.13
4386_별자리만들기  (0) 2022.05.12