반응형
너비 우선 탐색 (BFS, Breadth-First Search)
너비 우선 탐색(BFS)은 그래프 탐색 알고리즘 중 하나로, 시작 정점에서 출발하여 인접한 정점들을 모두 탐색한 후, 탐색이 끝난 정점의 인접 정점을 탐색하는 방식입니다. BFS는 큐 자료구조를 사용하여 구현할 수 있습니다.
BFS의 주요 특징:
- 시간 복잡도: (O(V + E)), 여기서 (V)는 정점의 수, (E)는 간선의 수입니다.
- 공간 복잡도: (O(V)), 큐와 방문 여부를 저장하는 배열의 크기입니다.
BFS 구현
그래프 구현 (인접 리스트 사용)
#include <iostream>
#include <vector>
#include <list>
#include <queue>
// 그래프 클래스 정의
class Graph {
public:
Graph(int vertices);
void addEdge(int v, int w); // 간선 추가
void BFS(int s); // BFS 호출
private:
int vertices; // 정점의 수
std::vector<std::list<int>> adjList; // 인접 리스트
};
// 그래프 생성자 정의
Graph::Graph(int vertices) {
this->vertices = vertices;
adjList.resize(vertices);
}
// 간선 추가 함수 정의
void Graph::addEdge(int v, int w) {
adjList[v].push_back(w); // 정점 v에 정점 w를 추가
}
// BFS 호출 함수 정의
void Graph::BFS(int s) {
std::vector<bool> visited(vertices, false); // 모든 노드를 방문하지 않은 상태로 초기화
std::queue<int> queue; // 탐색할 정점을 저장할 큐
// 시작 정점을 방문한 것으로 표시하고 큐에 추가
visited[s] = true;
queue.push(s);
while (!queue.empty()) {
// 큐에서 정점을 하나 꺼내서 출력
s = queue.front();
std::cout << s << " ";
queue.pop();
// 현재 정점과 인접한 모든 정점을 방문
for (auto i = adjList[s].begin(); i != adjList[s].end(); ++i) {
if (!visited[*i]) {
visited[*i] = true;
queue.push(*i);
}
}
}
}
// 메인 함수
int main() {
Graph g(4);
g.addEdge(0, 1);
g.addEdge(0, 2);
g.addEdge(1, 2);
g.addEdge(2, 0);
g.addEdge(2, 3);
g.addEdge(3, 3);
std::cout << "정점 2에서 시작하는 너비 우선 탐색: ";
g.BFS(2);
return 0;
}
설명
- 그래프 클래스:
vertices
: 그래프의 정점 수.adjList
: 각 정점의 인접 리스트를 저장하는 벡터.
- addEdge 함수:
- 정점 v에서 정점 w로의 간선을 그래프에 추가합니다.
- BFS 함수:
- 주어진 시작 정점에서 BFS를 수행합니다.
- 방문 여부를 추적하기 위해
visited
벡터를 사용하고, 탐색할 정점을 저장하기 위해 큐를 사용합니다. - 시작 정점을 방문한 것으로 표시하고 큐에 추가한 후, 큐가 빌 때까지 반복합니다.
- 큐에서 정점을 하나 꺼내서 출력하고, 현재 정점과 인접한 모든 정점을 방문합니다.
BFS의 기본 개념과 구현 방법을 이해했습니다. 다음 단계로 넘어가며, 더 복잡한 탐색 알고리즘과 다양한 알고리즘을 학습해보겠습니다.
질문이나 피드백이 있으면 언제든지 댓글로 남겨 주세요. 내일은 "Day 25: 다익스트라 알고리즘"에 대해 학습하겠습니다.
반응형
'-----ETC----- > C++로 배우는 알고리즘과 자료구조 시리즈' 카테고리의 다른 글
[C++로 배우는 알고리즘과 자료구조] Day 26: 플로이드-워셜 알고리즘 (Floyd-Warshall Algorithm) (0) | 2024.08.01 |
---|---|
[C++로 배우는 알고리즘과 자료구조] Day 23: 깊이 우선 탐색 (DFS) (0) | 2024.08.01 |
[C++로 배우는 알고리즘과 자료구조] Day 22: 이진 탐색 (Binary Search) (0) | 2024.08.01 |
[C++로 배우는 알고리즘과 자료구조] Day 20: 힙 정렬 (Heap Sort) (0) | 2024.08.01 |
[C++로 배우는 알고리즘과 자료구조] Day 21: 기수 정렬과 계수 정렬 (0) | 2024.08.01 |