BFS는 말 그대로 "너비를 우선으로 탐색"하는 알고리즘이야.\
즉, 현재 정점에서 가까운 정점부터 차례로 탐색해 나가는 방식이야.
BFS는 큐(Queue) 자료구조를 활용해서 동작해.
그래프:
1
| \
2 3
|
4
1 → 2 → 3 → 4
1[1]1[2, 3]2 → 큐 상태: [3]2의 인접 노드 없음 → 다음 방문: 3 → 인접한 노드 4 추가 → 큐 상태: [4]4 → 큐 상태: []| 항목 | 설명 |
|---|---|
| 탐색 순서 | 가까운 정점부터 탐색 |
| 사용 자료구조 | 큐 (FIFO) |
| 재귀? | ❌ (반복문 기반으로 구현) |
| 경로 찾기 문제 | 최단 거리 탐색에서 유용 |
| 시간 복잡도 | O(V + E) (V: 정점, E: 간선) |
| 기준 | BFS | DFS |
|---|---|---|
| 탐색 순서 | 가까운 노드부터 | 깊이 있는 노드부터 |
| 자료구조 | 큐 (Queue) | 스택 (Stack) or 재귀 |
| 구현 방식 | 반복문 기반 | 보통 재귀 기반 |
| 사용 예시 | 최단 거리, 네트워크 탐색 | 백트래킹, 미로 찾기 등 |
DFS는 깊이 파고들지만,\
BFS는 층층이 탐색한다는 점이 핵심이야.
예시 그래프가 있다고 해보자:
1 — 2
| |
4 — 3
여기서 1번 노드부터 BFS를 시작한다고 하자.
시작: 1
visited[1] = True[1]1을 꺼내고, 이웃 2와 4를 방문
parent[2] = 1, parent[4] = 1visited[2] = True, visited[4] = True[2, 4]이제 2를 꺼냄 → 이웃은 1(이미 방문), 3
3은 미방문이니까 방문함 → parent[3] = 2[4, 3]이제 4를 꺼냄 → 이웃은 1(부모), 3
→ 여기서 중요한 상황이 등장해!
4 → 3으로 가는 간선을 탐색할 때3은 이미 방문했어3은 4의 부모가 아니야 (parent[4]는 1이니까)즉, 4에서 3으로 가는 간선은 다른 경로로 이미 방문된 노드로 가는 길이야. 예를 들면 다음과 같은 경로를 생각할 수 있어:
1 → 2 → 3
↓ ↑
4 --------
이처럼 3을 두 번 만나게 되는 경우가 발생했는데, 이때 두 번째로 만났을 때의 이전 노드(4)가 3의 부모가 아니라는 점이 중요해.
→ 이건 사이클이 존재한다는 증거야.
if visited[u] and parent[pop_data] != u:
# 이미 방문한 노드를 만났고,
# 그 노드가 부모 노드가 아니라면 → 사이클 발생!
visited[u]: 이미 방문한 노드다.parent[pop_data] != u: 이 노드는 현재 노드의 부모가 아니다.