728x90
이번 포스트에서는 너비 우선 탐색(BFS) 알고리즘에 대해 다루도록 하겠습니다.
너비 우선 탐색(BFS)이란?
: 루트 노드(혹은 임의의 노드)부터 시작해서 인접한 노드를 먼저 탐색하는 방법입니다. 즉, 깊게 탐색하기 전에 넓게 탐색하는 것입니다.
너비 우선 탐색의 특징 :
- 재귀적으로 동작하지 않는다.
- 방문한 노드들을 차례대로 저장한 후 꺼낼 수 있는 자료 구조인 큐(Queue)를 사용한다.
- 어떤 노드를 방문했는지를 반드시 검사한다.
너비 우선 탐색의 동작 과정 :
- 초기 상태의 큐에는 시작 노드만 저장. (Q = [0])
- 큐에서 노드를 꺼내서 방문 및 인접 노드를 큐에 삽입 -> V0 방문 (Q = [1, 2])
- 더 이상 삽입할 인접한 노드가 없다면 dequeue 실행 (큐의 맨 앞에서 노드를 꺼낸다) -> V1 방문 (Q = [2])
- V1의 인접 노드를 큐에 삽입 (Q = [2, 3, 4])
- V2 방문 및 인접 노드 삽입 (Q = [3, 4, 5, 6])
- V3 방문 및 인접 노드 삽입 (Q = [4, 5, 6, 7], V1은 이미 방문했으니 생략)
- V4 방문 및 인접 노드 삽입 (Q = [5, 6, 7])
- V5 방문 및 인접 노드 삽입 (Q = [6, 7])
- V6 방문 및 인접 노드 삽입 (Q = [7])
- V7 방문 및 인접 노드 삽입 (Q = [], 더 이상 인접 노드가 없으니 종료)
- 최종 결과 : V0, V1, V2, V3, V4, V5, V6, V7
너비 우선 탐색 소스 코드 :
void bfs(int v)
{
node_pointer w;
queue_pointer front = NULL, rear = NULL;
printf("%5d", v);
visited[v] = TRUE;
addq(&front, &rear, v);
while (front) {
v = deleteq(&front);
for (w = graph[v]; w; w = w->link) {
if (!visited[w->vertex]) {
printf("%5d", w->vertex);
addq(&front, &rear, w->vertex);
visited[w->vertex] = TRUE;
}
}
}
}
소스 코드 분석 :
초기 노드부터 시작하여 방문하고 큐에 추가한다. 큐가 완전히 소진할 때까지 반복한다. 반복하는 동안에 이미 방문한 노드를 삭제하여 인접 노드 중 방문하지 않는 노드를 차례대로 큐에 삽입한다. 더 이상 인접 노드가 없으면 큐에서 제일 앞에 위치한 노드를 방문하고 삭제하여 이전 과정을 반복한다.
'Algorithm' 카테고리의 다른 글
최소비용 신장 트리 (0) | 2022.06.30 |
---|---|
깊이 우선 탐색(Depth-First Search) (0) | 2022.04.24 |
그래프 표현법(인접 행렬, 인접 리스트) (0) | 2022.04.22 |
그래프 (Graph) (0) | 2022.04.21 |
힙(Heap) (0) | 2022.04.19 |