์•Œ๊ณ ๋ฆฌ์ฆ˜/๊ทธ๋ž˜ํ”„

[๋ฐฑ์ค€ 15900 ๐Ÿฅˆ] ๋‚˜๋ฌด ํƒˆ์ถœ

1eehyunji 2023. 9. 2. 00:02

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

 

15900๋ฒˆ: ๋‚˜๋ฌด ํƒˆ์ถœ

ํ‰์†Œ์— ์‚ฌ์ด๊ฐ€ ์ข‹์ง€ ์•Š๋˜ ์„ฑ์›์ด์™€ ํ˜•์„์ด๊ฐ€ ๋“œ๋””์–ด ์ œ๋Œ€๋กœ ํ•œ ํŒ ๋ถ™์œผ๋ ค๊ณ  ํ•œ๋‹ค. ์„ฑ์›์ด์™€ ํ˜•์„์ด ๋‘˜๊ณผ ๋ชจ๋‘ ๋˜‘๊ฐ™์ด ์นœํ•œ ์ธ์„ญ์ด๊ฐ€ ๋Œ€๊ฒฐ ์ข…๋ชฉ์„ ์ •ํ•ด ๊ฐ€์ ธ์™”๋‹ค. ๋ฐ”๋กœ '๋‚˜๋ฌด ํƒˆ์ถœ' ์ด๋ผ๋Š” ๋ณด๋“œ๊ฒŒ

www.acmicpc.net

๋ฌธ์ œ

ํ‰์†Œ์— ์‚ฌ์ด๊ฐ€ ์ข‹์ง€ ์•Š๋˜ ์„ฑ์›์ด์™€ ํ˜•์„์ด๊ฐ€ ๋“œ๋””์–ด ์ œ๋Œ€๋กœ ํ•œ ํŒ ๋ถ™์œผ๋ ค๊ณ  ํ•œ๋‹ค. ์„ฑ์›์ด์™€ ํ˜•์„์ด ๋‘˜๊ณผ ๋ชจ๋‘ ๋˜‘๊ฐ™์ด ์นœํ•œ ์ธ์„ญ์ด๊ฐ€ ๋Œ€๊ฒฐ ์ข…๋ชฉ์„ ์ •ํ•ด ๊ฐ€์ ธ์™”๋‹ค. ๋ฐ”๋กœ '๋‚˜๋ฌด ํƒˆ์ถœ' ์ด๋ผ๋Š” ๋ณด๋“œ๊ฒŒ์ž„์ด๋‹ค.

'๋‚˜๋ฌด ํƒˆ์ถœ' ์€ N๊ฐœ์˜ ์ •์ ์ด ์žˆ๋Š” ํŠธ๋ฆฌ ๋ชจ์–‘์œผ๋กœ ์ƒ๊ธด ๊ฒŒ์ž„ํŒ๊ณผ ๋ช‡ ๊ฐœ์˜ ๊ฒŒ์ž„๋ง๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค. ํŠธ๋ฆฌ์˜ ๊ฐ ์ •์ ์—๋Š” 1๋ฒˆ๋ถ€ํ„ฐ N๋ฒˆ๊นŒ์ง€ ๋ฒˆํ˜ธ๊ฐ€ ๋ถ™์–ด์žˆ๋‹ค. 1๋ฒˆ ์ •์ ์€ '๋ฃจํŠธ ๋…ธ๋“œ' ๋ผ๊ณ  ๋ถˆ๋ฆฌ๋ฉฐ, ์ด ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ์ •์  ๊ฐ„์— ๋ถ€๋ชจ-์ž์‹ ๊ด€๊ณ„๊ฐ€ ๋งŒ๋“ค์–ด์ง„๋‹ค. ์ž์‹์ด ์—†๋Š” ๋…ธ๋“œ๋Š” '๋ฆฌํ”„ ๋…ธ๋“œ' ๋ผ๊ณ  ๋ถˆ๋ฆฐ๋‹ค.

์ด ๊ฒŒ์ž„์€ ๋‘ ์‚ฌ๋žŒ์ด ๋ฒˆ๊ฐˆ์•„ ๊ฐ€๋ฉด์„œ ๊ฒŒ์ž„ํŒ์— ๋†“์—ฌ์žˆ๋Š” ๊ฒŒ์ž„๋ง์„ ์›€์ง์ด๋Š” ๊ฒŒ์ž„์ด๋‹ค. ์ฒ˜์Œ์—๋Š” ํŠธ๋ฆฌ์˜ ๋ชจ๋“  ๋ฆฌํ”„ ๋…ธ๋“œ์— ๊ฒŒ์ž„๋ง์ด ํ•˜๋‚˜์”ฉ ๋†“์—ฌ์žˆ๋Š” ์ฑ„๋กœ ์‹œ์ž‘ํ•œ๋‹ค. ์–ด๋–ค ์‚ฌ๋žŒ์˜ ์ฐจ๋ก€๊ฐ€ ์˜ค๋ฉด, ๊ทธ ์‚ฌ๋žŒ์€ ํ˜„์žฌ ์กด์žฌํ•˜๋Š” ๊ฒŒ์ž„๋ง ์ค‘ ์•„๋ฌด๊ฑฐ๋‚˜ ํ•˜๋‚˜๋ฅผ ๊ณจ๋ผ ๊ทธ ๋ง์ด ๋†“์—ฌ์žˆ๋˜ ๋…ธ๋“œ์˜ ๋ถ€๋ชจ ๋…ธ๋“œ๋กœ ์˜ฎ๊ธด๋‹ค. ์ด ๊ณผ์ •์—์„œ ํ•œ ๋…ธ๋“œ์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฒŒ์ž„๋ง์ด ๋†“์ด๊ฒŒ ๋  ์ˆ˜๋„ ์žˆ๋‹ค. ์ด๋ ‡๊ฒŒ ์˜ฎ๊ธด ํ›„์— ๋งŒ์•ฝ ๊ทธ ๊ฒŒ์ž„๋ง์ด ๋ฃจํŠธ ๋…ธ๋“œ์— ๋„์ฐฉํ–ˆ๋‹ค๋ฉด ๊ทธ ๊ฒŒ์ž„๋ง์„ ์ฆ‰์‹œ ์ œ๊ฑฐํ•œ๋‹ค. ๋ชจ๋“  ๊ณผ์ •์„ ๋งˆ์น˜๋ฉด ๋‹ค์Œ ์‚ฌ๋žŒ์—๊ฒŒ ์ฐจ๋ก€๋ฅผ ๋„˜๊ธด๋‹ค. ์ด๋Ÿฐ ์‹์œผ๋กœ ๊ณ„์† ์ง„ํ–‰ํ•˜๋‹ค๊ฐ€ ๊ฒŒ์ž„๋ง์ด ๊ฒŒ์ž„ํŒ์— ์กด์žฌํ•˜์ง€ ์•Š์•„ ๊ณ ๋ฅผ ์ˆ˜ ์—†๋Š” ์‚ฌ๋žŒ์ด ์ง€๊ฒŒ ๋œ๋‹ค.

์„ฑ์›์ด๋ฅผ ์–•๋ณธ ํ˜•์„์ด๋Š” ์ฟจํ•˜๊ฒŒ ์ด ๊ฒŒ์ž„์˜ ์„ ์„ ์„ฑ์›์ด์—๊ฒŒ ์ค˜๋ฒ„๋ ธ๋‹ค. ๋”ฐ๋ผ์„œ ์„ฑ์›์ด๊ฐ€ ๋จผ์ € ์‹œ์ž‘ํ•˜๊ณ  ํ˜•์„์ด๊ฐ€ ๋‚˜์ค‘์— ์‹œ์ž‘ํ•œ๋‹ค. ๊ทธ๋™์•ˆ ํ˜•์„์ด์™€ ๋Œ€๊ฒฐ์„ ํ•˜๋ฉด ๋งค๋ฒˆ ์ง€๊ธฐ๋งŒ ํ–ˆ๋˜ ์„ฑ์›์ด๋Š” ๋งˆ์Œ์†์— ๋ถ„๋…ธ๊ฐ€ ๊ฐ€๋“ ์Œ“์˜€๋‹ค. ์ด๋ฒˆ ๋Œ€๊ฒฐ์—์„œ๋Š” ๋ฐ˜๋“œ์‹œ ์ด๊ฒจ์„œ ํ˜•์„์ด์˜ ์ฝ”๋ฅผ ๊บพ์–ด์ฃผ๊ณ  ์‹ถ๋‹ค. ๊ทธ๋ž˜์„œ ๊ฒŒ์ž„์„ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ๊ฒŒ์ž„ํŒ์˜ ๋ชจ์–‘๋งŒ ๋ณด๊ณ  ์ด ๊ฒŒ์ž„์„ ์ด๊ธธ ์ˆ˜ ์žˆ์„์ง€ ๋ฏธ๋ฆฌ ์•Œ์•„๋ณด๊ณ  ์‹ถ์–ด์กŒ๋‹ค. ์„ฑ์›์ด๊ฐ€ ์ด ๊ฒŒ์ž„์„ ์ด๊ธธ ์ˆ˜ ์žˆ์„์ง€ ์—†์„์ง€๋ฅผ ์•Œ๋ ค์ฃผ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค์–ด ์„ฑ์›์ด๋ฅผ ๋„์™€์ฃผ์ž.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ํŠธ๋ฆฌ์˜ ์ •์  ๊ฐœ์ˆ˜ N(2 ≤ N ≤ 500,000)์ด ์ฃผ์–ด์ง„๋‹ค.

๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N-1์ค„์— ๊ฑธ์ณ ํŠธ๋ฆฌ์˜ ๊ฐ„์„  ์ •๋ณด๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ค„๋งˆ๋‹ค ๋‘๊ฐœ์˜ ์ž์—ฐ์ˆ˜ a, b(1 ≤ a, b ≤ N, a ≠ b)๊ฐ€ ์ฃผ์–ด์ง€๋Š”๋ฐ, ์ด๋Š” a์™€ b ์‚ฌ์ด์— ๊ฐ„์„ ์ด ์กด์žฌํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค.

์ถœ๋ ฅ

์„ฑ์›์ด๊ฐ€ ์ตœ์„ ์„ ๋‹คํ–ˆ์„ ๋•Œ ์ด ๊ฒŒ์ž„์„ ์ด๊ธธ ์ˆ˜ ์žˆ์œผ๋ฉด Yes, ์•„๋‹ˆ๋ฉด No๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

๋ฌธ์ œ ํ’€์ด

# ์ด๋™ ๊ฑฐ๋ฆฌ๊ฐ€ ํ™€์ˆ˜์—ฌ์•ผ ์„ฑ์›์ด๊ฐ€ ์ด๊ธธ ์ˆ˜ ์žˆ๋‹ค.
import sys
from collections import deque

n=int(sys.stdin.readline())
tree=[[] for _ in range(n+1)]
for _ in range(n-1):
    a,b=map(int, sys.stdin.readline().split(' '))
    tree[a].append(b)
    tree[b].append(a)

ans=0
def bfs(cur, parent, depth):
    global ans
    queue=deque()
    queue.append((cur, parent, depth))
    while queue:
        c, p, d=queue.popleft()
        # ๋ฆฌํ”„ ๋…ธ๋“œ์ธ์ง€ ํ™•์ธ(์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๊ฐ€ ํ•˜๋‚˜์ด๊ณ , ๊ทธ ๋…ธ๋“œ๊ฐ€ ๋ถ€๋ชจ ๋ชจ๋“œ์ด๋ฉด ๋ฆฌํ”„ ๋…ธ๋“œ)
        if len(tree[c])==1 and tree[c][0]==p:
            ans+=d
            continue
        for node in tree[c]:
            if node!=p:
                queue.append((node, c, d+1))

bfs(1,-1,0)

if ans%2==1:
    print('Yes')
else:
    print('No')
  • ์šฐ์„  ์„ฑ์›์ด๊ฐ€ ์„ ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฃจํŠธ ๋…ธ๋“œ์—์„œ ๋ฆฌํ”„ ๋…ธ๋“œ๊นŒ์ง€์˜ ์ด์–ด์ง€๋Š” ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜๊ฐ€ ํ™€์ˆ˜์—ฌ์•ผ ์„ฑ์›์ด๊ฐ€ ์ด๊ธธ ์ˆ˜ ์žˆ๋‹ค.
  • ์•„๋ž˜ ์˜ˆ์‹œ์™€ ๊ฐ™์ด, ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ง์ˆ˜๋กœ 4๊ฐœ์ธ ๊ฒฝ์šฐ ์„ฑ์›์ด๊ฐ€ ์ง€๊ณ , ํ™€์ˆ˜๋กœ 3๊ฐœ์ธ ๊ฒฝ์šฐ ์„ฑ์›์ด ์ด๊ธด๋‹ค. 
  • (์„ฑ์›-ํ˜•์„-์„ฑ์›-ํ˜•์„) -> ์„ฑ์›์ด๊ฐ€ ๋ง์„ ๊ณ ๋ฅผ ์ฐจ๋ก€์— ๊ณ ๋ฅผ ๋ง์ด ์—†์Œ
  • (์„ฑ์›-ํ˜•์„-์„ฑ์›) -> ํ˜•์„์ด๊ฐ€ ๋ง์„ ๊ณ ๋ฅผ ์ฐจ๋ก€์— ๊ณ ๋ฅผ ๋ง์ด ์—†์Œ 

  • ์ฒ˜์Œ์—” ๋‹ค์Œ๊ณผ ๊ฐ™์ด DFS๋กœ ๊ตฌํ˜„ํ–ˆ์—ˆ๋‹ค.
def dfs(cur, parent, depth):
    global ans
    # ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๊ฐ€ ํ•˜๋‚˜์ด๊ณ , ๊ทธ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๊ฐ€ ๋ถ€๋ชจ์ผ ๊ฒฝ์šฐ ๊ทธ ๋…ธ๋“œ๋Š” ๋ฆฌํ”„ ๋…ธ๋“œ
    if len(tree[cur])==1 and tree[cur][0]==parent:
        ans+=depth
        return
    for node in tree[cur]:
        if node==parent:
            continue
        dfs(node, cur, depth+1)
  • ๊ธฐ๋ณธ์ ์œผ๋ก  DFS์™€ BFS์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ ๋™์ผํ•˜์ง€๋งŒ, ์žฌ๊ท€์— ์•ฝํ•œ ํŒŒ์ด์ฌ์˜ ํŠน์„ฑ์ƒ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒƒ ๊ฐ™๋‹ค. ใ…œใ…œ..(์•„๋ฌด๋ฆฌ ์ƒ๊ฐํ•ด๋„ ์›์ธ์€ ์ด๊ฒƒ๋ฟ์ธ๋ฐ.. ํ˜น์‹œ ์•„์‹œ๋Š” ๋ถ„ ๊ณ„์‹œ๋ฉด ๋Œ“๊ธ€ ๋‹ฌ์•„์ฃผ์‹œ๋ฉด ์ •๋ง ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค..!!)
  • ๊ทธ๋ž˜์„œ ์œ„ ์ฝ”๋“œ์™€ ๊ฐ™์ด BFS๋กœ ๋ณ€๊ฒฝํ–ˆ๋‹ค.
  • ํ์— (ํ˜„์žฌ ๋…ธ๋“œ, ๋ถ€๋ชจ ๋…ธ๋“œ, ๊นŠ์ด)๋ฅผ ๋„ฃ์–ด์ฃผ๋ฉด์„œ ํ˜„์žฌ ๋…ธ๋“œ์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ค‘ ๋ถ€๋ชจ ๋…ธ๋“œ๊ฐ€ ์•„๋‹Œ ๋…ธ๋“œ๋“ค์„ ํ์— ๋„ฃ์–ด์ฃผ๋ฉด์„œ ๊นŠ์ด๋ฅผ +1ํ•ด์ฃผ๋ฉด ๋œ๋‹ค. 
  • ์–ด๋–ค ๋…ธ๋“œ์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๊ฐ€ 1๊ฐœ์ด๋ฉด์„œ ๊ทธ ๋…ธ๋“œ๊ฐ€ ๋ถ€๋ชจ ๋…ธ๋“œ์ผ ๊ฒฝ์šฐ ๋ฆฌํ”„ ๋…ธ๋“œ๋ž€ ๋œป์ด๋ฏ€๋กœ ์ €์žฅ๋œ depth๋ฅผ ans์— ๋”ํ•ด์ค€๋‹ค.
  • BFS ํƒ์ƒ‰์ด ๋๋‚˜๋ฉด ans๊ฐ€ ํ™€์ˆ˜์ด๋ฉด Yes๋ฅผ ์ถœ๋ ฅํ•˜๊ณ , ์ง์ˆ˜์ด๋ฉด No๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.