Problem Solving/[ν•­ν•΄99] TIL

99클럽 μ½”ν…Œ μŠ€ν„°λ”” 5일차 TIL / BFS(λ„ˆλΉ„ μš°μ„  탐색)

geum 2024. 11. 2. 09:18

✏️ 문제

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

 

μ˜€λŠ˜λ„ μ„œμ€€μ΄λŠ” λ„ˆλΉ„ μš°μ„  탐색(BFS) μˆ˜μ—… 쑰ꡐλ₯Ό ν•˜κ³  μžˆλ‹€. μ•„λΉ κ°€ μˆ˜μ—…ν•œ λ‚΄μš©μ„ 학생듀이 잘 μ΄ν•΄ν–ˆλŠ”μ§€ 문제λ₯Ό ν†΅ν•΄μ„œ ν™•μΈν•΄λ³΄μž.

N개의 정점과 M개의 κ°„μ„ μœΌλ‘œ κ΅¬μ„±λœ 무방ν–₯ κ·Έλž˜ν”„(undirected graph)κ°€ 주어진닀. 정점 λ²ˆν˜ΈλŠ” 1λ²ˆλΆ€ν„° N번이고 λͺ¨λ“  κ°„μ„ μ˜ κ°€μ€‘μΉ˜λŠ” 1이닀. 정점 Rμ—μ„œ μ‹œμž‘ν•˜μ—¬ λ„ˆλΉ„ μš°μ„  νƒμƒ‰μœΌλ‘œ λ…Έλ“œλ₯Ό λ°©λ¬Έν•  경우 λ…Έλ“œμ˜ λ°©λ¬Έ μˆœμ„œλ₯Ό 좜λ ₯ν•˜μž.

λ„ˆλΉ„ μš°μ„  탐색 μ˜μ‚¬ μ½”λ“œλŠ” λ‹€μŒκ³Ό κ°™λ‹€. μΈμ ‘ 정점은 μ˜€λ¦„μ°¨μˆœμœΌλ‘œ λ°©λ¬Έν•œλ‹€.

 

πŸ€– μž…μΆœλ ₯ μ˜ˆμ‹œ

 

🧐 λ‚œμ΄λ„/μ†Œμš” μ‹œκ°„

βœ… λ‚œμ΄λ„: solved.ac κΈ°μ€€ S2

βœ… μ†Œμš” μ‹œκ°„: 20λΆ„

βœ… ꢌμž₯ μ‹œκ°„: 45λΆ„

 

πŸ’‘ 풀이

1) 문제 μœ ν˜• νŒŒμ•…

4일차 λ¬Έμ œμ™€ μœ μ‚¬ν•œ μ•Œκ³ λ¦¬μ¦˜ μˆ˜μ—… μ‹œλ¦¬μ¦ˆλ‘œ, BFS μ•Œκ³ λ¦¬μ¦˜μ„ κ΅¬ν˜„ν•˜λ©΄ λ˜λŠ” λ¬Έμ œμ˜€λ‹€.

 

2) 아이디어 흐름

β‘  BFS μ•Œκ³ λ¦¬μ¦˜ κΈ°λ³Έ ν‹€ ꡬ성

BFS의 핡심은 큐λ₯Ό ν™œμš©ν•˜λŠ” 것이닀. κ°€μž₯ λ¨Όμ € μ‹œμž‘ 정점 R을 큐에 λ°”λ‘œ μΆ”κ°€ν•˜κ³  λ°©λ¬Έ 처리λ₯Ό 해쀬닀.

 

popleft λ©”μ„œλ“œλ₯Ό μ΄μš©ν•΄ 큐에 μ €μž₯λ˜μ–΄ μžˆλŠ” λ…Έλ“œλ₯Ό ν•˜λ‚˜μ”© κΊΌλ‚΄μ€€ ν›„ κ·Έλž˜ν”„μƒμ—μ„œ ν•΄λ‹Ή λ…Έλ“œμ™€ μ—°κ²°λ˜μ–΄ μžˆλŠ” λ…Έλ“œ(next_node둜 μ •μ˜)λ₯Ό μ˜€λ¦„μ°¨μˆœμœΌλ‘œ ν™•μΈν•œλ‹€. visited λ°°μ—΄μ˜ next_node번째 인덱슀 값이 0인 경우, 아직 λ°©λ¬Έν•˜μ§€ μ•Šμ•˜λ‹€λŠ” 뜻이기 λ•Œλ¬Έμ— visited[next_node]λ₯Ό λ°©λ¬Έ μˆœμ„œ κ°’μœΌλ‘œ κ°±μ‹ ν•œλ‹€.

 

μœ„μ˜ 과정을 큐가 빌 λ•ŒκΉŒμ§€ λ°˜λ³΅ν•˜λ©΄ 문제 ν•΄κ²°!

 

3) κ΅¬ν˜„

import sys

from collections import deque

input = sys.stdin.readline

N, M, R = map(int, input().split())

graph = {k: [] for k in range(1, N+1)}

visited = [0]*(N+1)
    
for _ in range(M):
    u, v = map(int, input().split())
    
    graph[u].append(v)
    graph[v].append(u)

visit_order = 1

def BFS(R):
    global visit_order
    
    queue = deque([R])
    
    visited[R] = visit_order
     
    while queue:
        node = queue.popleft()
            
        for next_node in sorted(graph[node]):
            if visited[next_node] == 0:
                visit_order += 1
                
                visited[next_node] = visit_order

                queue.append(next_node)

BFS(R)

print(*visited[1:], sep="\n")

 

4) μ–΄λ €μ› λ˜ 점/배운 μ 

🚨 μ–΄λ €μ› λ˜ 점

  • μ—†μŒ

❗ 배운 점

  • 이번 λ¬Έμ œμ—μ„œλŠ” λ”±νžˆ μ—†μ—ˆμŒ