BFS(Breadth-First Search)는 그래프 탐색 알고리즘 중 하나로, 이름 그대로 너비 우선으로 탐색.

그래프 (G = (V, E))가 주어질 때, BFS는 다음과 같이 동작.
dist[s] = 0 dist[v] = dist[u] + 1parent[v] = uQ.enqueue(v)즉, BFS는 그래프를 "계층적 탐색 트리(Level Tree)"로 변환하는 과정

시간:
O(V + E) O(V^2) (큰 그래프에서는 비효율적) 공간:
O(V) O(V)# 큐에 넣을 때 체크 (권장)
for v in adj[u]:
if not visited[v]:
visited[v] = True
q.append(v)
BFS는 가중치가 동일한 그래프에서만 최단 거리 보장
다른 가중치라면 다익스트라 혹은 0-1 BFS 사용
여러 시작점에서 동시에 BFS 수행 가능
큐에 모든 시작점 넣고 dist[start]=0 초기화
전파 문제(토마토, 불 확산)에서 자주 사용
def reconstruct_path(parent, target):
path = []
cur = target
while cur != -1:
path.append(cur)
cur = parent[cur]
return path[::-1]
BFS 탐색 중 parent[v] = u 기록
목표 지점에서 부모를 따라가면서 최단 경로 복원 가능
DFS는 최단 경로를 보장하지 않음 → BFS 사용 필수
미로, 섬 찾기 등 격자 그래프 문제
좌표 (y, x)를 노드로 처리, 상하좌우 이동
from collections import deque
def bfs_grid(board, start):
n, m = len(board), len(board[0])
dist = [[-1]*m for _ in range(n)]
q = deque([start])
dist[start[0]][start[1]] = 0
dirs = [(0,1),(1,0),(0,-1),(-1,0)] # 4방향
while q:
y, x = q.popleft()
for dy, dx in dirs:
ny, nx = y+dy, x+dx
if 0 <= ny < n and 0 <= nx < m and board[ny][nx]==0 and dist[ny][nx]==-1:
dist[ny][nx] = dist[y][x] + 1
q.append((ny, nx))
return dist
최단 경로: 미로, 숨바꼭질, 단일 시작점 최단 거리
멀티 소스 전파: 토마토, 바이러스, 불, 감염 확산
연결 요소: 무방향 그래프에서 컴포넌트 개수
트리 레벨 순회: Level-order Traversal
0-1 BFS: 간선 가중치가 0 또는 1인 그래프 최단 거리
최소 회전/이동 문제: 체스 이동, 슬라이딩 퍼즐, 최소 단계 문제