BFS (Breath-First Search)
- BFS는 너비 우선 탐색이라고도 부르며, 그래프에서 가까운 노드부터 우선적으로 탐색하는 알고리즘
- BFS는 큐 자료구조를 이용하며, 구체적인 동작 과정은 다음과 같습니다.
- 탐색 시작 노드를 큐에 삽입하고 방문 처리를 합니다.
- 큐에서 노드를 꺼낸 뒤에 해당 노드의 인접 노드 중에서 방문하지 않은 노드를 모듀 큐에 삽입하고 방문 처리합니다.
- 더 이상 2번의 과정을 수행할 수 없을 때까지 반복합니다.
BFS 동작 예시
- [Step 0] 그래프를 준비합니다. (방문 기준: 번호가 낮은 인접 노드부터)
- 시작 노드: 1
- [Step 1] 시작 노드인 '1'을 큐에 삽입하고 방문 처리를 합니다.
- [Step 2] 큐에서 노드 '1'을 꺼내 방문하지 않은 인접 노드 '2', '3', '8'을 큐에 삽입하고 방문 처리합니다.
- [Step 3] 큐에서 노드 '2'를 꺼내 방문하지 않은 인접 노드 '7'을 큐에 삽입하고 방문 처리합니다.
- [Step 4] 큐에서 노드 '3'을 꺼내 방문하지 않은 인접 노드 '4', '5'를 큐에 삽입하고 방문 처리합니다.
- [Step 5] 큐에서 노드 '8'을 꺼내고 방문하지 않은 인접 노드가 없으므로 무시합니다.
- 이러한 과정을 반복하여 전체 노드의 탐색 순서(큐에 들어간 순서)는 다음과 같습니다.
- 탐색 순서: 1 -> 2 -> 3 -> 8 -> 7 -> 4 -> 5 -> 6
자바 코드 ▽
더보기
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.List;
import java.util.Queue;
public class Main {
static List<ArrayList<Integer>> graph;
static boolean visited[];
public static void main(String[] args) {
graph = new ArrayList<>(new ArrayList<>());
visited = new boolean[9];
for(int i = 0; i < 9; i ++) {
graph.add(new ArrayList<>());
}
graph.get(1).add(2);
graph.get(1).add(3);
graph.get(1).add(8);
graph.get(2).add(1);
graph.get(2).add(7);
graph.get(3).add(1);
graph.get(3).add(4);
graph.get(3).add(5);
graph.get(4).add(3);
graph.get(4).add(5);
graph.get(5).add(3);
graph.get(5).add(4);
graph.get(6).add(7);
graph.get(7).add(2);
graph.get(7).add(6);
graph.get(7).add(8);
graph.get(8).add(1);
graph.get(8).add(7);
bfs(1);
}
private static void bfs(int start) {
Queue<Integer> queue = new ArrayDeque<>();
queue.add(start);
visited[start] = true;
while(!queue.isEmpty()) {
int v = queue.poll();
System.out.print(v + " ");
for(int i = 0; i < graph.get(v).size(); i ++) {
if(!visited[graph.get(v).get(i)]) {
queue.add(graph.get(v).get(i));
visited[graph.get(v).get(i)] = true;
}
}
}
}
}
파이썬 코드 ▽
from collections import deque
# BFS 메서드 정의
def bfs(graph, start, visited):
# 큐(Queue) 구현을 위해 deque 라이브러리 사용
queue = deque([start])
# 현재 노드를 방문 처리
visited[start] = True
# 큐가 빌 때까지 반복
while queue:
# 큐에서 하나의 원소를 뽑아 출력하기
v = queue.popleft()
print(v, end=' ')
# 아직 방문하지 않은 인접한 원소들을 큐에 삽입
for i in graph[v]:
if not visited[i]:
queue.append(i)
visited[i] = True
# 각 노드가 연결된 정보를 표현 (2차원 리스트)
graph = [
[],
[2, 3, 8],
[1, 7],
[1, 4, 5],
[3, 5],
[3, 4],
[7],
[2, 6, 8],
[1, 7]
]
visited = [False] * 9
bfs(graph, 1, visited)