โ์คํจ๋ ์ฑ๊ณต์ ์ด๋จธ๋, ๋๋ฒ๊น ์ ๊ฐ๋ฐ์ ์๋ฒ์ง!โ
๐ป ๋ฐฑ์ค 11725: ํธ๋ฆฌ์ ๋ถ๋ชจ ์ฐพ๊ธฐ
- ๋ฌธ์ ๋งํฌ: https://www.acmicpc.net/problem/11725
- ์๊ณ ๋ฆฌ์ฆ ๋ถ๋ฅ: ํธ๋ฆฌ, ๋๋น ์ฐ์ ํ์, ๊ทธ๋ํ ํ์
๐ค ์ด ๋ฌธ์ , ์ด๋ป๊ฒ ํ๊น? (์์ฝ)
- ์ฒซ์ธ์: โํธ๋ฆฌ? ํด๋์ค ๋ง๋ค์ด์ ํ๋ฉด ๋๊ฒ ๋ค!โ ๐ ์ด์ง ํธ๋ฆฌ๋ก ์ฐฉ๊ฐํด์ ๋ฐํ์ ์๋ฌ! ๐ญ
- ๊นจ๋ฌ์: โ์, ํธ๋ฆฌ๋ ๊ทธ๋ฅ ๊ทธ๋ํ์์ง!โ ๐ BFS๋ก ๋ฐฉํฅ ์ ํ!
- ํด๊ฒฐ: ๋ฃจํธ(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๋ฅผ ๋๋ฉด์ ํ์ํ๋ ๋ ธ๋๋ค์ ๋ถ๋ชจ๋ฅผ ๊ธฐ๋กํด์ฃผ๋ฉด ๋๋ ๊ฑฐ์๋ค.
- ์ธ์ ๋ฆฌ์คํธ๋ก ๊ทธ๋ํ๋ฅผ ๋ง๋ ๋ค.
parent
๋ฐฐ์ด์ ๋ง๋ค์ด ๊ฐ ๋ ธ๋์ ๋ถ๋ชจ๋ฅผ ์ ์ฅํ๋ค. (๋ฐฉ๋ฌธ ์ฒดํฌ์ฉ์ผ๋ก๋ ์ฌ์ฉ!)- ํ์ 1๋ฒ ๋ ธ๋๋ฅผ ๋ฃ๊ณ BFS ์์!
- ํ์์ ๊บผ๋ธ ๋ ธ๋์ ์ฐ๊ฒฐ๋ ๋ ์๋ค ์ค, ์์ง ๋ถ๋ชจ๊ฐ ์๋(๋ฐฉ๋ฌธ ์ ํ) ๋ ธ๋๋ฅผ ๋ฐ๊ฒฌํ๋ฉด, ํ์ฌ ๋ ธ๋๋ฅผ ๋ถ๋ชจ๋ก ๊ธฐ๋กํ๊ณ ํ์ ์ ๋ฃ์ด์ค๋ค.
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๋ก ์ ๊ทผํ๋ ๋ชจ๋ ๋ ธ๋๋ฅผ ๋ฑ ํ ๋ฒ์ฉ๋ง ๋ฐฉ๋ฌธํด์ ์์ฃผ ํจ์จ์ ์ผ๋ก ๋ถ๋ชจ๋ฅผ ์ฐพ์ ์ ์์๋ค. ์ญ์ ๊ธฐ๋ณธ๊ธฐ๊ฐ ์ค์ํ๋ค!
์ค๋์ ๊ตํ ๐ค
- ์ฃ๋ถ๋ฅธ ์ผ๋ฐํ๋ ๊ธ๋ฌผ: โํธ๋ฆฌ? ์~ ์ด์ง ํธ๋ฆฌ!โ ํ๊ณ ๋๊ฒจ์ง์๋ ๊ฒ ํจ์ธ์ด์๋ค. ๋ฌธ์ ์ ๋ช ์๋์ง ์์ ์กฐ๊ฑด์ ์ค์ค๋ก ๋ง๋ค์ง ๋ง์.
- ์์ ๋ ๊ฑฐ๋ค ๋ฟ: ์์ ๋ ๊ทธ๋ฅ ์ฐธ๊ณ ์๋ฃ์ผ ๋ฟ, ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ๋๋ณํด์ฃผ์ง ์๋๋ค. ํญ์ ๋ ์ผ๋ฐ์ ์ด๊ณ ์ง๊ถ์ ์ผ์ด์ค๊ฐ ์จ์ด์์ ๊ฑฐ๋ผ๊ณ ์๊ฐํ๋ฉฐ ์ฝ๋๋ฅผ ์ง์ผ๊ฒ ๋ค.