parent 배열에 동시 기록하여 역추적
# 8039번: 미로 탐색 발췌
while q:
r, c = q.popleft()
if (r, c) == end:
found = True
break
for dir_name, (dr, dc) in dirs.items():
nr, nc = r + dr, c + dc
if 0 <= nr < n and 0 <= nc < m and grid[nr][nc] != '#' and not visited[nr][nc]:
visited[nr][nc] = True
parent[nr][nc] = (r, c, dir_name)
q.append((nr, nc))
heapq의 정렬 구조를 고려하여 (거리, 노드) 구조의 튜플로 우선순위 큐 관리
# 8041번: 가장 단거리 경로 I 발췌
dist = [float('inf')] * (n + 1)
dist[1] = 0
pq = [(0, 1)] # (거리, 노드)
while pq:
d, u = heapq.heappop(pq)
if d > dist[u]:
continue
for v, w in adj[u]:
if dist[u] + w < dist[v]:
dist[v] = dist[u] + w
heapq.heappush(pq, (dist[v], v))
# 8042번: 도로 보수 발췌
def find(i):
if parent[i] == i:
return i
parent[i] = find(parent[i])
return parent[i]
def union(i, j):
root_i = find(i)
root_j = find(j)
if root_i != root_j:
parent[root_i] = root_j
return True
return False
appendleft), 1인 이동은 뒤에(append) 추가해 $O(V+E)$ 최적화
# 8043번: 0-1 최단 경로 발췌
cost = 0 if grid[curr_r][curr_c] == grid[nr][nc] else 1
if dist[curr_r][curr_c] + cost < dist[nr][nc]:
dist[nr][nc] = dist[curr_r][curr_c] + cost
if cost == 0:
q.appendleft((nr, nc))
else:
q.append((nr, nc))
sys.setrecursionlimit(10**6)을 반드시 명시해 에러 방지
- **방문 체크 타이밍**: BFS 탐색 시 중복 노드가 들어가지 않도록 큐에 **넣기 직전** 방문 마킹 수행
- **최소 힙 비교 순서**: 힙 큐 튜플 연산 시 반드시 (거리, 노드) 구조를 준수하여 오정렬 차단