โ€œ์‹คํŒจ๋Š” ์„ฑ๊ณต์˜ ์–ด๋จธ๋‹ˆ, ๋””๋ฒ„๊น…์€ ๊ฐœ๋ฐœ์˜ ์•„๋ฒ„์ง€!โ€


๐Ÿ’ป ๋ฐฑ์ค€ 11725: ํŠธ๋ฆฌ์˜ ๋ถ€๋ชจ ์ฐพ๊ธฐ

  • ๋ฌธ์ œ ๋งํฌ: https://www.acmicpc.net/problem/11725
  • ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ถ„๋ฅ˜: ํŠธ๋ฆฌ, ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰, ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰

๐Ÿค” ์ด ๋ฌธ์ œ, ์–ด๋–ป๊ฒŒ ํ’€๊นŒ? (์š”์•ฝ)

  1. ์ฒซ์ธ์ƒ: โ€œํŠธ๋ฆฌ? ํด๋ž˜์Šค ๋งŒ๋“ค์–ด์„œ ํ’€๋ฉด ๋˜๊ฒ ๋„ค!โ€ ๐Ÿ‘‰ ์ด์ง„ ํŠธ๋ฆฌ๋กœ ์ฐฉ๊ฐํ•ด์„œ ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ! ๐Ÿ˜ญ
  2. ๊นจ๋‹ฌ์Œ: โ€œ์•„, ํŠธ๋ฆฌ๋Š” ๊ทธ๋ƒฅ ๊ทธ๋ž˜ํ”„์˜€์ง€!โ€ ๐Ÿ‘‰ BFS๋กœ ๋ฐฉํ–ฅ ์ „ํ™˜!
  3. ํ•ด๊ฒฐ: ๋ฃจํŠธ(1)๋ถ€ํ„ฐ BFS๋ฅผ ๋Œ๋ฉด์„œ, ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ๋ฅผ ๋งŒ๋‚  ๋•Œ๋งˆ๋‹ค ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ๋ถ€๋ชจ๋กœ ๊ธฐ๋กํ•ด์ฃผ๋‹ˆ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ•ด๊ฒฐ๋๋‹ค. ์„ฑ๊ณต! ๐ŸŽ‰

๋ฌธ์ œ ์†Œ๊ฐœ ๐Ÿง

๋ฃจํŠธ๊ฐ€ ์—†๋Š” ํŠธ๋ฆฌ๊ฐ€ ์ฃผ์–ด์ง€๋Š”๋ฐ, 1๋ฒˆ ๋…ธ๋“œ๋ฅผ ๋ฃจํŠธ๋ผ๊ณ  ๋”ฑ ์ •ํ•ด์คฌ๋‹ค. ์ด๋•Œ ๊ฐ ๋…ธ๋“œ์˜ ๋ถ€๋ชจ๊ฐ€ ๋ˆ„๊ตฐ์ง€ ์ฐพ์•„ ์ถœ๋ ฅํ•˜๋ฉด ๋˜๋Š” ๋ฌธ์ œ๋‹ค.

์ž…๋ ฅ ๐Ÿ“

  • ์ฒซ ์ค„์—๋Š” ๋…ธ๋“œ ๊ฐœ์ˆ˜ N์ด ์ฃผ์–ด์ง„๋‹ค.
  • ๋‹ค์Œ๋ถ€ํ„ด ๊ทธ๋ƒฅ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ๋‘ ๊ฐœ์”ฉ N-1 ์ค„์— ๊ฑธ์ณ์„œ ๋‚˜์˜จ๋‹ค.

์ถœ๋ ฅ ๐Ÿ“ค

  • 2๋ฒˆ ๋…ธ๋“œ๋ถ€ํ„ฐ ์ˆœ์„œ๋Œ€๋กœ, ๊ฐ์ž์˜ ๋ถ€๋ชจ ๋…ธ๋“œ ๋ฒˆํ˜ธ๋ฅผ ์ถœ๋ ฅํ•˜๋ฉด ๋œ๋‹ค.

์ œํ•œ โŒ

  • ์‹œ๊ฐ„: 1์ดˆ
  • ๋ฉ”๋ชจ๋ฆฌ: 256MB

์ฒซ ๋ฒˆ์งธ ์‹œ๋„: โ€œ๋‚ด๊ฐ€ ์ง์ ‘ ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด๋ณผ๊นŒ?โ€ ๐Ÿ‘Š

Idea

์ฒ˜์Œ์—” ์˜์š•์ด ๋„˜์ณค๋‹ค. Tree ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด์„œ parent, left, right ์†์„ฑ์„ ์ฃผ๊ณ , 1๋ฒˆ ๋…ธ๋“œ๋ถ€ํ„ฐ ์ฐจ๊ณก์ฐจ๊ณก ์ž์‹๋“ค์„ ์—ฐ๊ฒฐํ•ด์ฃผ๋ฉด ๋˜๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ์ด๋• ๋ชฐ๋ž๋‹ค. ์ด ํŠธ๋ฆฌ๊ฐ€ ๋‚ด ์ƒ๊ฐ๋ณด๋‹ค ํ›จ์”ฌ ์ž์œ ๋กœ์šด ์˜ํ˜ผ์ด์—ˆ๋‹ค๋Š” ๊ฒƒ์„โ€ฆ

Code

import sys
from collections import deque

n =  int(sys.stdin.readline().rstrip())
dic = {}
q = deque()

class Tree:
    parent:"Tree"
    own_num:int
    left:"Tree"
    right:"Tree"

    def __init__(self,  own_num:int, parent:"Tree" = None):
        self.own_num = own_num
        self.parent = parent
        self.left = None
        self.right = None
    
    def set_child(self, child:"Tree"):
        if self.left is None:
            self.left = child
        elif self.right is None:
            self.right = child
        else:
            return False
        return True
    
    def get_right(self):
        return self.right.own_num if self.right is not None else 0
    def get_left(self):
        return self.left.own_num if self.left is not None else 0
    def get_parent(self):
        return self.parent.own_num if self.parent is not None else 0

tree_list = [None] * (n + 1)
tree_list[1] = Tree(1)

for i in range(1, n):
    a, b = map(int, sys.stdin.readline().split())
    if dic.get(a) is None:
        dic[a] = [b]
    else:
        dic[a].append(b)
    if dic.get(b) is None:
        dic[b] = [a]
    else:
        dic[b].append(a)

root = tree_list[1]
q.append(root)
val_q= deque()
while q:
    node = q.popleft()
    values = dic.get(node.own_num)
    for val in values:
        val_q.append(val)

    while node.right is None and val_q:
        val = val_q.pop()
        if val == node.get_left() or val == node.get_right() or val == node.get_parent():
            break
        n_node = Tree(val, node)
        node.set_child(n_node)
        tree_list[val] = n_node
        q.append(n_node)

for i in range(2, n + 1):
    print(tree_list[i].get_parent())

Result

  • ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ! โฐ
  • ์˜ˆ์ œ๋Š” ์ž˜ ๋Œ์•„๊ฐ”๋Š”๋ฐ, ์ œ์ถœํ•˜๋‹ˆ ๋ฐ”๋กœ ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๊ฐ€ ๋–ด๋‹ค. ์™œ ํ‹€๋ ธ๋Š”์ง€ ์ƒ๊ฐํ•ด๋ณด๋‹ˆ, ์˜ˆ์ œ์—” ์ž์‹์ด ์…‹ ์ด์ƒ์ธ ๋…ธ๋“œ๊ฐ€ ์—†์–ด์„œ ๋‚ด๊ฐ€ ์ด์ง„ ํŠธ๋ฆฌ๋ผ๊ณ  ์ฐฉ๊ฐํ–ˆ๋˜ ๊ฑฐ๋‹ค. ์‹ค์ œ๋กœ๋Š” ํ•œ ๋ถ€๋ชจ ์•„๋ž˜ ์ž์‹์ด ์—ฌ๋Ÿฟ์ผ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๋‚ด ์ฝ”๋“œ๋Š” left, right ๋ฐ–์— ์—†์œผ๋‹ˆ ๋‹น์—ฐํžˆ ์—๋Ÿฌ๊ฐ€ ๋‚  ์ˆ˜๋ฐ–์—.

๋‘ ๋ฒˆ์งธ ์‹œ๋„: โ€œ์ •์‹  ์ฐจ๋ฆฌ๊ณ , BFSโ€ โœจ

Idea

์ฒซ ์‹œ๋„์˜ ์‹คํŒจ๋กœ ๊นจ๋‹ฌ์Œ์„ ์–ป์—ˆ๋‹ค. โ€œํŠธ๋ฆฌ๋Š” ์‚ฌ์ดํด ์—†๋Š” ๊ทธ๋ž˜ํ”„๋‹ค!โ€ ์ด ๋ช…์ œ๋ฅผ ๋– ์˜ฌ๋ฆฌ๊ณ  ๋‚˜๋‹ˆ ๊ธธ์ด ๋ณด์˜€๋‹ค. ๋ฃจํŠธ ๋…ธ๋“œ์ธ 1๋ฒˆ๋ถ€ํ„ฐ BFS๋ฅผ ๋Œ๋ฉด์„œ ํƒ์ƒ‰ํ•˜๋Š” ๋…ธ๋“œ๋“ค์˜ ๋ถ€๋ชจ๋ฅผ ๊ธฐ๋กํ•ด์ฃผ๋ฉด ๋˜๋Š” ๊ฑฐ์˜€๋‹ค.

  1. ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋กœ ๊ทธ๋ž˜ํ”„๋ฅผ ๋งŒ๋“ ๋‹ค.
  2. parent ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด ๊ฐ ๋…ธ๋“œ์˜ ๋ถ€๋ชจ๋ฅผ ์ €์žฅํ•œ๋‹ค. (๋ฐฉ๋ฌธ ์ฒดํฌ์šฉ์œผ๋กœ๋„ ์‚ฌ์šฉ!)
  3. ํ์— 1๋ฒˆ ๋…ธ๋“œ๋ฅผ ๋„ฃ๊ณ  BFS ์‹œ์ž‘!
  4. ํ์—์„œ ๊บผ๋‚ธ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ ๋…€์„๋“ค ์ค‘, ์•„์ง ๋ถ€๋ชจ๊ฐ€ ์—†๋Š”(๋ฐฉ๋ฌธ ์•ˆ ํ•œ) ๋…ธ๋“œ๋ฅผ ๋ฐœ๊ฒฌํ•˜๋ฉด, ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ๋ถ€๋ชจ๋กœ ๊ธฐ๋กํ•˜๊ณ  ํ์— ์™ ๋„ฃ์–ด์ค€๋‹ค.

Code

import sys
from collections import deque

def bfs(graph, start_node, parent):
    queue = deque([start_node])
    parent[start_node] = start_node  # ๋ฃจํŠธ๋Š” ์ž๊ธฐ์ž์‹ ์„ ๋ถ€๋ชจ๋กœ... (๋ฐฉ๋ฌธํ‘œ์‹œ)
    
    while queue:
        u = queue.popleft()
        for v in graph[u]:
            if parent[v] == 0:  # ์•„์ง ๋ถ€๋ชจ๊ฐ€ ์—†๋‹ˆ?
                parent[v] = u   # ๋‚ด๊ฐ€ ๋„ˆ์˜ ๋ถ€๋ชจ๋‹ค!
                queue.append(v)

# (์ž…๋ ฅ ์ฒ˜๋ฆฌ ๋ฐ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ถ€๋ถ„์€ ๋™์ผ)

Result

  • ์„ฑ๊ณต! โœ…
  • BFS๋กœ ์ ‘๊ทผํ•˜๋‹ˆ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ๋”ฑ ํ•œ ๋ฒˆ์”ฉ๋งŒ ๋ฐฉ๋ฌธํ•ด์„œ ์•„์ฃผ ํšจ์œจ์ ์œผ๋กœ ๋ถ€๋ชจ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์—ญ์‹œ ๊ธฐ๋ณธ๊ธฐ๊ฐ€ ์ค‘์š”ํ•˜๋‹ค!

์˜ค๋Š˜์˜ ๊ตํ›ˆ ๐Ÿค”

  • ์„ฃ๋ถ€๋ฅธ ์ผ๋ฐ˜ํ™”๋Š” ๊ธˆ๋ฌผ: โ€œํŠธ๋ฆฌ? ์•„~ ์ด์ง„ ํŠธ๋ฆฌ!โ€ ํ•˜๊ณ  ๋„˜๊ฒจ์งš์—ˆ๋˜ ๊ฒŒ ํŒจ์ธ์ด์—ˆ๋‹ค. ๋ฌธ์ œ์— ๋ช…์‹œ๋˜์ง€ ์•Š์€ ์กฐ๊ฑด์€ ์Šค์Šค๋กœ ๋งŒ๋“ค์ง€ ๋ง์ž.
  • ์˜ˆ์ œ๋Š” ๊ฑฐ๋“ค ๋ฟ: ์˜ˆ์ œ๋Š” ๊ทธ๋ƒฅ ์ฐธ๊ณ  ์ž๋ฃŒ์ผ ๋ฟ, ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋ณ€ํ•ด์ฃผ์ง€ ์•Š๋Š”๋‹ค. ํ•ญ์ƒ ๋” ์ผ๋ฐ˜์ ์ด๊ณ  ์ง“๊ถ‚์€ ์ผ€์ด์Šค๊ฐ€ ์ˆจ์–ด์žˆ์„ ๊ฑฐ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉฐ ์ฝ”๋“œ๋ฅผ ์งœ์•ผ๊ฒ ๋‹ค.