๊ฐœ๋ฐœ์ž ์ทจ์—… ์ค€๋น„/์ทจ์ค€ ํ›„๊ธฐ

๋ฐฑ์ค€ 2606 ๋ฐ”์ด๋Ÿฌ์Šค - ํŒŒ์ด์ฌ

stoneeee 2022. 12. 31. 00:10

 

 

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

 

2606๋ฒˆ: ๋ฐ”์ด๋Ÿฌ์Šค

์ฒซ์งธ ์ค„์—๋Š” ์ปดํ“จํ„ฐ์˜ ์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ปดํ“จํ„ฐ์˜ ์ˆ˜๋Š” 100 ์ดํ•˜์ด๊ณ  ๊ฐ ์ปดํ“จํ„ฐ์—๋Š” 1๋ฒˆ ๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ๋ฒˆํ˜ธ๊ฐ€ ๋งค๊ฒจ์ง„๋‹ค. ๋‘˜์งธ ์ค„์—๋Š” ๋„คํŠธ์›Œํฌ ์ƒ์—์„œ ์ง์ ‘ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ์ปดํ“จํ„ฐ ์Œ์˜ ์ˆ˜๊ฐ€ ์ฃผ์–ด

www.acmicpc.net

 

 

 

์Šคํƒ ๋‹ค๋“œํ•œ ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ ๋ฌธ์ œ์ด๋‹ค.

 

 

 

- DFS ํ’€์ด

์ปดํ“จํ„ฐ(๋…ธ๋“œ) ๊ฐ„์˜ ์—ฐ๊ฒฐ ์ •๋ณด๋Š” graph๋ผ๋Š” ์ด์ฐจ์› ๋ฐฐ์—ด์— ์ €์žฅํ–ˆ๋‹ค. 

graph[n]์—๋Š” n๋ฒˆ ์ปดํ“จํ„ฐ์™€ ์—ฐ๊ฒฐ๋œ ์ปดํ“จํ„ฐ๋“ค์„ ์ €์žฅํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด 1๋ฒˆ ์ปดํ“จํ„ฐ๊ฐ€ 2, 4๋ฒˆ ์ปดํ“จํ„ฐ์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค๋ฉด graph[1] = [2, 4]๊ฐ€ ๋œ๋‹ค.

 

๊ทธ๋‹ค์Œ ๊ทธ๋ž˜ํ”„์— ์ปดํ“จํ„ฐ๋“ค ๊ฐ„์˜ ์—ฐ๊ฒฐ๊ด€๊ณ„๋ฅผ input ๋ฐ›์•„์„œ ์ €์žฅํ•œ๋‹ค.

1๋ฒˆ๊ณผ 2๋ฒˆ ์ปดํ“จํ„ฐ๊ฐ€ ์„œ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค๋ฉด graph[1]์—๋„ 2๋ฅผ append ํ•ด์ฃผ๊ณ , graph[2]์—๋„ 1์„ append ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

 

 

 

๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰์„ ํ•  ๋•Œ ์ด๋ฏธ ์ฒดํฌํ•œ ์ปดํ“จํ„ฐ๋ฅผ ๋˜ ํ™•์ธํ•˜๊ณ  ๋˜ ํ™•์ธํ•˜๋ฉด ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋‚œ๋‹ค.

๊ทธ๋ž˜์„œ ์ฒดํฌ ์—ฌ๋ถ€๋ฅผ ์ €์žฅํ•ด์ฃผ๊ธฐ ์œ„ํ•ด checked ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด์ค€๋‹ค.

๋ณดํ†ต int ๋ฐฐ์—ด๋กœ ์„ ์–ธํ•˜๊ณ  1, 0์œผ๋กœ ์“ฐ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์€๋ฐ, ๋‚˜๋Š” ์ทจํ–ฅ๊ป boolean ๋ฐฐ์—ด๋กœ ๋งŒ๋“ค์—ˆ๋‹ค.

1๋ฒˆ ์ปดํ“จํ„ฐ๋Š” ์ฒ˜์Œ๋ถ€ํ„ฐ ๊ฐ์—ผ๋˜์–ด ์žˆ์„ ๊ฑฐ๋‹ˆ๊นŒ True๋กœ ์ดˆ๊ธฐํ™”ํ–ˆ๋‹ค.

 

 

 

 

์ด์ œ ๋ณธ๊ฒฉ์ ์ธ ๊ฐ์—ผ ์ „ํŒŒ๋ฅผ ์‹œ์ž‘ํ•  ๊ฒƒ์ด๋‹ค.

stack์ด๋ผ๋Š” ์Šคํƒ ๋ฆฌ์ŠคํŠธ์— ์ €์žฅํ•  ์ปดํ“จํ„ฐ๋Š” ๋ฐฉ๊ธˆ ๋ง‰ ๊ฐ์—ผ๋œ ์ปดํ“จํ„ฐ๋“ค์ด๋‹ค.

์‹œ์ž‘ํ•  ๋•Œ๋Š” ๊ฐ์—ผ์›์ธ 1๋งŒ ๋‹ด๊ฒจ ์žˆ๋‹ค.

์ด ์ปดํ“จํ„ฐ์™€ ์—ฐ๊ฒฐ๋œ ์ปดํ“จํ„ฐ๋“ค์„ ๊ฐ์—ผ์‹œ์ผœ์•ผ ํ•œ๋‹ค.

 

 

while๋ฌธ์„ ๋Œ๋ ค๋ณด์ž.

 

์ผ๋‹จ ์ตœ๊ทผ์— ๊ฐ์—ผ๋œ ์ปดํ“จํ„ฐ๋ฅผ pop ํ•œ๋‹ค. ์ด๋ฆ„์€ curr๋ผ๊ณ  ๋ถ™์˜€๋‹ค.

curr์™€ ์—ฐ๊ฒฐ๋œ ์ปดํ“จํ„ฐ๋“ค์„ ๋‹ด์€ ๋ฆฌ์ŠคํŠธ๊ฐ€ graph[curr]์ด๋‹ˆ๊นŒ ๊ทธ ์•ˆ์— ๋‹ด๊ฒจ์žˆ๋Š” ์ปดํ“จํ„ฐ๋“ค์„ ํƒ์ƒ‰ํ•œ๋‹ค.

 

curr๊ณผ ์—ฐ๊ฒฐ๋œ next ์ปดํ“จํ„ฐ ์ค‘์— ์•„์ง ์ฒดํฌ๋ฅผ ์•ˆ ํ•œ ์ปดํ“จํ„ฐ๊ฐ€ ์žˆ๋‹ค๋ฉด checked[next]๋ฅผ True๋กœ ๊ฐฑ์‹ ํ•ด ์ค€๋‹ค.

๋ฐฉ๊ธˆ ๋ง‰ ๊ฐ์—ผ๋๋‹ค. stack์— append ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

stack ๋ฌด์–ธ๊ฐ€๊ฐ€ ๋‹ด๊ฒจ์žˆ๋Š” ํ•œ ๊ณ„์† ํƒ์ƒ‰์„ ํ•œ๋‹ค.

์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ์ปดํ“จํ„ฐ๊ฐ€ ๊ฐ์—ผ์ด ๋˜์—ˆ๋‹ค๋ฉด stack์ด ๋น„๊ฒŒ ๋˜๊ณ , while๋ฌธ์ด break ๋  ๊ฒƒ์ด๋‹ค.

 

 

 

checked์— ์ฒดํฌ๋œ ์ปดํ“จํ„ฐ, ์ฆ‰ ๊ฐ์—ผ๋œ ์ปดํ“จํ„ฐ์˜ ์ˆ˜๋Š” checked์—์„œ True์˜ ๊ฐœ์ˆ˜๋ฅผ ์นด์šดํŠธํ•ด์ฃผ๋ฉด ์•Œ ์ˆ˜ ์žˆ๋‹ค.

๋‹ค๋งŒ, 1๋ฒˆ ์ปดํ“จํ„ฐ๋Š” ์›๋ž˜๋ถ€ํ„ฐ ๊ฐ์—ผ๋˜์–ด ์žˆ์—ˆ์œผ๋ฏ€๋กœ ๋‹ต์—์„œ 1์„ ๋นผ์•ผ ํ•œ๋‹ค.

 

 

 

 

N = int(input()) # ์ปดํ“จํ„ฐ์˜ ๊ฐœ์ˆ˜
graph = [[] for _ in range(N+1)] # graph[n]์—๋Š” n๋ฒˆ ์ปดํ“จํ„ฐ์™€ ์—ฐ๊ฒฐ๋œ ์ปดํ“จํ„ฐ๋“ค์„ ์ €์žฅ

# ๊ทธ๋ž˜ํ”„์— ์ปดํ“จํ„ฐ๋“ค ๊ฐ„์˜ ์—ฐ๊ฒฐ ๊ด€๊ณ„ ์ €์žฅ
for _ in range(int(input())): 
    a, b = map(int, input().split())
    graph[a].append(b)
    graph[b].append(a)


# ์ฒดํฌ ์—ฌ๋ถ€ ์ €์žฅํ•  ๋ฐฐ์—ด
checked = [False] * (N+1)
checked[1] = True

# 1๋ฒˆ ์ปดํ“จํ„ฐ์—์„œ ๋ฐ”์ด๋Ÿฌ์Šค ์‹œ์ž‘
stack = [1]

# DFS
while stack: # ๋” ์ด์ƒ ํ™•์ธํ•  ์ปดํ“จํ„ฐ๊ฐ€ ์—†์œผ๋ฉด break
    curr = stack.pop() # ์ตœ๊ทผ์— ๊ฐ์—ผ๋œ ์ปดํ“จํ„ฐ๋ถ€ํ„ฐ ํ™•์ธ

    for next in graph[curr]: # curr ๋ฒˆ ์ปดํ“จํ„ฐ์™€ ์—ฐ๊ฒฐ๋œ ์ปดํ“จํ„ฐ๋“ค ์ˆœํšŒ
        if not checked[next]: # ์•„์ง ์ฒดํฌ ์•ˆํ•œ ์ปดํ“จํ„ฐ๋ผ๋ฉด
            checked[next] = True # ์ฒดํฌ
            stack.append(next) # ์ด ์ปดํ“จํ„ฐ๋ž‘ ์—ฐ๊ฒฐ๋œ ์ปดํ“จํ„ฐ๋„ ์ฒดํฌํ•  ๊ฑฐ์–Œ

print(checked.count(True)-1) # 1๋ฒˆ ์ปดํ“จํ„ฐ ๋นผ๊ณ  ๊ฐ์—ผ๋œ ์ปดํ“จํ„ฐ์˜ ์ˆ˜ ์ถœ๋ ฅ

 

 

 

์ด ํ’€์ด๊ฐ€ DFS์ธ ์ด์œ ๋Š” stack์—์„œ pop ํ•ด๊ฐ€๋ฉฐ ๋‹ค์Œ ์ปดํ“จํ„ฐ๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ๋ฐฉ๋ฒ• ์ด์–ด์„œ๋‹ค.

 

1๋ฒˆ ์ปดํ“จํ„ฐ์— 2, 4๋ฒˆ์ด ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ๋ผ๊ณ  ์น˜๋ฉด,

1๋ฒˆ > 2๋ฒˆ > 2๋ฒˆ์— ์—ฐ๊ฒฐ๋œ ๋ญ์‹œ๊ธฐ > ๋ญ์‹œ๊ธฐ์— ์—ฐ๊ฒฐ๋œ ์ €์‹œ๊ธฐ ์ˆœ์œผ๋กœ ํƒ์ƒ‰ํ•˜๊ฒŒ ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ €์‹œ๊ธฐ์˜ ์ €์‹œ๊ธฐ๊นŒ์ง€ ๋๊นŒ์ง€ ํƒ์ƒ‰์„ ํ•˜๋ฉด ๊ทธ์ œ์„œ์•ผ 4๋ฒˆ ์ปดํ“จํ„ฐ๋ฅผ ํƒ์ƒ‰ํ•˜๊ฒŒ ๋œ๋‹ค.

 

BFS์˜ ๊ฒฝ์šฐ์—๋Š” 1๋ฒˆ >> 2๋ฒˆ > 4๋ฒˆ >> 2๋ฒˆ์— ์—ฐ๊ฒฐ๋œ ๋ญ์‹œ๊ธฐ๋“ค > 4๋ฒˆ์— ์—ฐ๊ฒฐ๋œ ๋ญ์‹œ๊ธฐ๋“ค ... ์ด๋Ÿฐ ์ˆœ์„œ๋กœ ํƒ์ƒ‰ํ•˜๊ฒŒ ๋œ๋‹ค.

 

 

 

์‚ฌ์‹ค ์–ด๋–ป๊ฒŒ ํƒ์ƒ‰ํ•ด๋„ ์ƒ๊ด€์—†๋Š” ๋ฌธ์ œ์ด๋‹ค.

์ด๋Ÿฐ ๊ฒฝ์šฐ์—๋Š” ์Šคํƒ ์ž๋ฃŒํ˜•์„ ์‚ฌ์šฉํ•˜๋Š” DFS ํ’€์ด๊ฐ€ ๋œ ๊ท€์ฐฎ์ง€๋งŒ ๊ณต๋ถ€ํ•˜๊ธฐ ์œ„ํ•ด์„œ BFS๋กœ ํ’€์–ด๋ด๋„ ์ข‹๋‹ค.

 

 

 

 

 

- BFS ํ’€์ด

 

from collections import deque

N = int(input())
graph = [[] for _ in range(N+1)]

for _ in range(int(input())):
    a, b = map(int, input().split())
    graph[a].append(b)
    graph[b].append(a)


visited = [False] * (N+1)
visited[1] = True

queue = deque([1])

while queue:
    curr = queue.popleft()

    for next in graph[curr]:
        if not visited[next]:
            visited[next] = True
            queue.append(next)

print(visited.count(True)-1)

 

 

DFS ํ’€์ด์™€ ๋˜‘๊ฐ™๋‹ค.

 

์Šคํƒ์ด ์•„๋‹Œ ๋ฑ์„ ์‚ฌ์šฉํ–ˆ๋‹จ ๊ฒƒ๋งŒ ๋‹ค๋ฅด๋‹ค.

์‚ฌ์‹ค ๊ทธ๋ƒฅ queue๋ฅผ ์“ฐ๋ฉด ๋˜๋Š”๋ฐ, ํŒŒ์ด์ฌ์—์„œ๋Š” ํ๋ณด๋‹ค ๋ฑ์ด ๋น ๋ฅด๋‹ค. ๋ฌผ๋ก  ํ๋ฅผ ์จ๋„ ์ด๋ฌธ์ œ๋Š” ํ†ต๊ณผ๋œ๋‹ค.

๋’ค์—์„œ pop ํ•ด์„œ ์“ฐ๋Š” ์Šคํƒ๊ณผ ๋‹ฌ๋ฆฌ ์•ž์—์„œ popleft ํ•ด์„œ ํƒ์ƒ‰ํ•˜๊ฒŒ ๋ผ์„œ 1๋ฒˆ ์ปดํ“จํ„ฐ์™€ ์—ฐ๊ฒฐ๋œ ์ฐจ์ˆ˜ ์ˆœ์„œ๋Œ€๋กœ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๊ฒ ๋‹ค.

 

 

 

์ข€ ๋” ์˜ค๋ฒ„ํ•˜์ž๋ฉด ์—ฐ๊ฒฐ ๊ด€๊ณ„๋ฅผ ํ™•์ธํ•˜๋Š” ๋ฌธ์ œ๋‹ˆ๊นŒ ์œ ๋‹ˆ์˜จ ํŒŒ์ธ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ๋„ ํ’€ ์ˆ˜ ์žˆ๋‹ค.