๋ฌธ์
https://www.acmicpc.net/problem/4803
๋ฐฑ์ค ๋จ๊ณ๋ณ๋ก ํ์ด๋ณด๊ธฐ - ํธ๋ฆฌ
ํ์ด
์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง ๊ทธ๋ํ์ ํธ๋ฆฌ๊ฐ ์๋ค๋ฉด "No trees."๋ฅผ, ํ ๊ฐ๋ผ๋ฉด "There is one tree."๋ฅผ, T๊ฐ(T > 1)๋ผ๋ฉด "A forest of T trees."๋ฅผ ํ ์คํธ ์ผ์ด์ค ๋ฒํธ์ ํจ๊ป ์ถ๋ ฅํ๋ค.
์ ๋ง ์ด์ฒ๊ตฌ๋ ์๋ ์ค์๋ก ์ฝ์งํ๋ ๋ฌธ์ ๋ค;;
์
๋ ฅ๊ฐ์ผ๋ก ์ฃผ์ด์ง๋ ๊ฐ์ ์ '๋
ธ๋1 ๋
ธ๋2' ์ ํํ๋ก ๋์ด์๋๋ฐ, ๋ถ๋ชจ-์์ ์์๋ก ์ฃผ์ด์ง๋๊ฒ ์๋๋ค.
๋๋์ง๋ง ์ด ์ค์๋ก ๊ฑฐ์ง 20๋ถ์ ์ฝ์งํ๊ฒ๊ฐ๋ค.(์ด๊ฒ ์๋ ๋ฆฌ๊ฐ ์๋๋ฐ ์ ์๋์ง?์ ๋ฐ๋ณต)
์ผ๋จ ๊ฐ์ ๋ค์ ์ ์ฅํ 2์ฐจ์ ๋ฆฌ์คํธ๋ฅผ ์์ฑํด์ค๋ค. ๊ฐ ํ์๋ ๋น ๋ฆฌ์คํธ๊ฐ ๋ค์ด๊ฐ๋ค.
lst = [[], [], []] ← ์ด๋ฐ ํํ๊ฐ ๋๊ฒ ๋ค.
๊ทธ๋ฆฌ๊ณ ๋ฌด๋ฐฉํฅ ๊ทธ๋ํ์ด๋ฏ๋ก, ์๋ฐฉํฅ์ผ๋ก ์ ์ฅํด์ค๋ค.
๊ทธ๋ฆฌ๊ณ ์ฃผ์ด์ง ๊ทธ๋ํ๋ ์ฌ๋ฌ๊ฐ์ ํธ๋ฆฌ๊ฐ ์์์๋, ํ๋์ ํธ๋ฆฌ๋ง ์์์๋, ํธ๋ฆฌ๊ฐ ์์ ์์์๋ ์๋ค.
๋ฐ๋ผ์ BFS๋ฅผ ์ฌ๋ฌ๋ฒ ์คํํด์ผ ํ๋ค.
๋ง์ฝ ๊ทธ๋ํ๋ฅผ ํ์ ์ค ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋๊ฐ ๋ฐ๊ฒฌ๋๋ค๋ฉด, ํด๋น ๋ ธ๋๋ฅผ ์์์ ์ผ๋ก BFS๋ฅผ ์คํํ๋ค.
BFS๋ฅผ ์คํํ๋ฉฐ ๋ ธ๋์ ์, ๊ฐ์ ์ ์๋ฅผ ์ ์ฅํ ๋ค ๋ง์ง๋ง์ ํธ๋ฆฌ ์กฐ๊ฑด์ ๋ถํฉํ๋์ง ์ฒดํฌํ๋ค.
โํธ๋ฆฌ์ ์กฐ๊ฑด: ๊ฐ์ ์ ์๋ ๋ ธ๋์ ์-1 ์ด์ด์ผ ํจ.
์ฐธ๊ณ ๋ก ๊ฐ์ ์ ์๋ //2๋ฅผ ํด์ค์ผ ํ๋ค. ์๋ฐฉํฅ์ผ๋ก ์ ์ฅํด์คฌ๊ธฐ ๋๋ฌธ์ด๋ค.
์กฐ๊ฑด์ ๋ง์กฑํ๋ค๋ฉด True, ์๋๋ผ๋ฉด False๋ฅผ ๋ฐํํ๊ณ ,
๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋๊ฐ ๋์ฌ๋๊น์ง ๋ง์ ํ์ํ๋ค.
์ ์ฒด ์ฝ๋
# โญ ๋ฌด๋ฐฉํฅ ๊ทธ๋ํ๋ก ์์ ํ ๊ฒฐ๊ณผ
# ๋ฉ๋ชจ๋ฆฌ: 37180KB / ์๊ฐ: 200ms
import sys
from collections import deque
input = sys.stdin.readline
def bfs(tree, visited, start):
queue = deque([start])
visited[start] = True
node_cnt = edge_cnt = 0
while queue:
curr_node = queue.popleft()
node_cnt += 1
for node in tree[curr_node]:
edge_cnt += 1
if not visited[node]:
visited[node] = True
queue.append(node)
# ๊ฐ์ ์ ์๋ฐฉํฅ์ผ๋ก ์ ์ฅ๋๋ฏ๋ก 2๋ก ๋๋์ด์ค๋ค.
edge_cnt //= 2
# ํธ๋ฆฌ ์กฐ๊ฑด: ๊ฐ์ ์๋ ์ ์ ์ - 1์ด์ด์ผ ํจ
return True if edge_cnt == node_cnt-1 else False
order = 1
while True:
n, m = map(int, input().split())
if n == 0 and m == 0:
break
tree = [[] for _ in range(n + 1)]
for _ in range(m):
u, v = map(int, input().split())
tree[u].append(v)
tree[v].append(u) # ์๋ฐฉํฅ ๊ฐ์ ์ ์ฅ
visited = [False] * (n + 1)
ret = 0
for i in range(1, n + 1):
if not visited[i]:
if bfs(tree, visited, i):
ret += 1
print(f"Case {order}: ", end="")
if ret == 0:
print("No trees.")
elif ret == 1:
print("There is one tree.")
else:
print(f"A forest of {ret} trees.")
order += 1