시작 정점에서 가까운 정점부터 한 겹씩 넓혀 가며 방문하는 탐색. 큐에 이웃을 넣고 넣은 순서대로 꺼낸다.
function bfs(graph: Record<string, string[]>, start: string) {
const visited = new Set([start])
const queue = [start]
const order: string[] = []
for (let i = 0; i < queue.length; i++) { // shift 대신 인덱스로 O(1)
const v = queue[i]
order.push(v)
for (const next of graph[v]) {
if (!visited.has(next)) { visited.add(next); queue.push(next) }
}
}
return order
}- 큐에 넣을 때 방문 표시를 해야 같은 정점이 여러 번 들어가지 않는다
- 시간
O(V + E). 넓은 그래프에서는 한 층 전체가 큐에 담겨 메모리를 많이 쓴다 - 가중치 없는 그래프의 최단 경로(간선 수가 가장 적은 길)를 보장한다. 처음 도착한 순간이 가장 가까운 경로다
- 쓰임: 미로 최단 거리, SNS에서 "몇 다리 건너 아는 사람", 웹 크롤러, 트리의 층별 순회
간선마다 비용이 다르면 BFS로는 부족하고 다익스트라 알고리즘를 쓴다. 한 갈래를 깊게 파는 반대 방식은 깊이 우선 탐색 (DFS), 그래프 표현은 그래프.