[BOJ][๐ก5][๋ฐฑ์ค#15681] ํธ๋ฆฌ์ ์ฟผ๋ฆฌ
์์ฑ:    
์ ๋ฐ์ดํธ:
์นดํ ๊ณ ๋ฆฌ: BOJ Gold V
๋ฌธ์ ์ถ์ฒ
๋ฌธ์
๊ฐ์ ์ ๊ฐ์ค์น์ ๋ฐฉํฅ์ฑ์ด ์๋ ์์์ ๋ฃจํธ ์๋ ํธ๋ฆฌ๊ฐ ์ฃผ์ด์ก์ ๋, ์๋์ ์ฟผ๋ฆฌ์ ๋ตํด๋ณด๋๋ก ํ์.
์ ์ U๋ฅผ ๋ฃจํธ๋ก ํ๋ ์๋ธํธ๋ฆฌ์ ์ํ ์ ์ ์ ์๋ฅผ ์ถ๋ ฅํ๋ค.
๋ง์ฝ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ์ ์ด๋ ค์์ด ์๋ค๋ฉด, ํ๋จ์ ํํธ์ ์ฒจ๋ถํ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ์.
์ ๋ ฅ
ํธ๋ฆฌ์ ์ ์ ์ ์ N๊ณผ ๋ฃจํธ์ ๋ฒํธ R, ์ฟผ๋ฆฌ์ ์ Q๊ฐ ์ฃผ์ด์ง๋ค. (2 โค N โค 105, 1 โค R โค N, 1 โค Q โค 105) ์ด์ด N-1์ค์ ๊ฑธ์ณ, U V์ ํํ๋ก ํธ๋ฆฌ์ ์ํย ๊ฐ์ ์ ์ ๋ณด๊ฐ ์ฃผ์ด์ง๋ค. (1 โค U, V โค N, U โ V) ์ด๋ U์ V๋ฅผ ์ ๋์ ์ผ๋ก ํ๋ ๊ฐ์ ์ด ํธ๋ฆฌ์ ์ํจ์ ์๋ฏธํ๋ค. ์ด์ด Q์ค์ ๊ฑธ์ณ, ๋ฌธ์ ์ ์ค๋ช ํ U๊ฐ ํ๋์ฉ ์ฃผ์ด์ง๋ค. (1 โค U โค N) ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋ ํธ๋ฆฌ๋ ํญ์ ์ฌ๋ฐ๋ฅธ ํธ๋ฆฌ์์ด ๋ณด์ฅ๋๋ค.
์ถ๋ ฅ
Q์ค์ ๊ฑธ์ณ ๊ฐ ์ฟผ๋ฆฌ์ ๋ต์ ์ ์ ํ๋๋ก ์ถ๋ ฅํ๋ค.
์์
์ ๋ ฅ
9 5 3
1 3
4 3
5 4
5 6
6 7
2 3
9 6
6 8
5
4
8
์ถ๋ ฅ
9
4
1
My Sol
import sys
input = sys.stdin.readline
sys.setrecursionlimit(200000)
def calc_subtree(u):
global visit, rels, S
if visit[u]: return 0
visit[u] = 1
cnt = 1
for v in rels[u]:
if visit[v]: continue
cnt += calc_subtree(v)
S[u] = cnt
return cnt
V, R, Q = map(int, input().split())
rels = [[] for _ in range(V+1)]
visit = [0]*(V+1)
S = [0]*(V+1)
for _ in range(V-1):
u, v = map(int, input().split())
rels[u].append(v)
rels[v].append(u)
calc_subtree(R)
for _ in range(Q):
print(S[int(input())])
DFS์ DP๋ฅผ ํ์ฉํด์ ์๋ธํธ๋ฆฌ์ ๊ฐ์๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ์๋ค. DFS์ ์ข ๋ฃ์กฐ๊ฑด์ ์ฃผ์ํ๋ค.
- visit ๋ฐฐ์ด์ด 1, ์ฆ ๋ฐฉ๋ฌธํ ๊ฒฝ์ฐ ์์ ๋ ธ๋์ธ ๊ฒ์ผ๋ก ๊ฐ์ฃผํ๊ณ 0์ ๋ฐํํ๋ค.
- leaf ๋ ธ๋๋ ์์ ๋ ธ๋๋ง ์กด์ฌํ๊ณ ์ด๋ visit์ด๋ฏ๋ก 0์ ๋ฐํํด 1๋ก ์ด๊ธฐํํ cnt ์์ฒด๋ฅผ ๋ฐํํ๋ค. ์ฆ, leaf ๋ ธ๋๋ ์๋ธ ํธ๋ฆฌ์ ๋ ธ๋ ๊ฐ์๊ฐ 1๊ฐ์ด๋ค.
- ์์ ๋ ธ๋๋ ํ์ ๋ ธ๋ 1~2๊ฐ์ ๋ํด ๊ฐ๊ฐ์ ์๋ธํธ๋ฆฌ ๊ฐ์ + ์๊ธฐ ์์ ์ ๊ฐ์์ธ 1์ ๋ํ ๊ฐ์ด ์๋ธํธ๋ฆฌ ๊ฐ์์ด๋ค.
- R๋ถํฐ ์์ํด ์๋ธํธ๋ฆฌ์ ๋ ธ๋ ๊ฐ์๋ฅผ ๋ชจ๋ ๊ณ์ฐํด์ฃผ๊ณ , Q๊ฐ์ ๋ํ์ฌ ์ถ๋ ฅํ๋ฉด ๋๊ฒ ๋ค.
๊ฒฐ๊ณผ
๋ง์์ต๋๋ค!!
๋ชจ๋ฒ๋ต์
# empty
๋๊ธ๋จ๊ธฐ๊ธฐ