Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 | 21 | 22 |
| 23 | 24 | 25 | 26 | 27 | 28 | 29 |
| 30 |
Tags
- map
- C++
- 프로그래머스
- DP
- 배열
- 유클리드호제법
- 백준
- Sort
- 문자열
- vector
- 알고리즘
- 깊이우선탐색
- priority_queue
- DFS
- 에라토스테네스의 체
- 오블완
- 그래프
- 분할정복
- 티스토리챌린지
- int
- stoi
- 백트래킹
- N과M
- BFS
- 우선순위큐
- 최소공배수
- 다이나믹프로그래밍
- Set
- 정렬
- 이분탐색
Archives
- Today
- Total
안녕 세상아,
[c++/알고리즘] BFS 개념 및 예제 본문
BFS (너비 우선 탐색)
- 개념:
- BFS는 시작 노드에서부터 가까운 노드부터 차례대로 탐색하는 방식이다.
- 주로 최단 경로를 찾는 문제나, 레벨 순서 탐색이 필요한 문제에서 유용하게 사용된다.
- 너비 우선 탐색에서는 큐 (Queue) 자료 구조를 사용하여, 먼저 방문한 노드를 기준으로 탐색을 진행한다.
- 동작 원리:
- 초기화: 시작 노드를 큐에 넣고, 방문 표시를 한다.
- 큐에서 노드를 꺼내며 탐색: 큐에서 노드를 하나씩 꺼내며, 해당 노드와 인접한 노드를 모두 확인한다.
- 인접 노드를 큐에 추가: 방문하지 않은 인접 노드를 큐에 추가하고, 방문 표시를 한다.
- 반복: 큐가 빌 때까지 2번과 3번 과정을 반복한다.
- BFS 알고리즘의 특징:
- 경로 길이 최적화: 가중치가 동일한 그래프에서 최단 거리를 찾을 수 있다.
- 노드의 깊이 별 탐색: 깊이 레벨별로 탐색하기 때문에 같은 깊이에 있는 모든 노드를 탐색한 후에 다음 깊이로 넘어간다.
<코드 템플릿>
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
vector<int> graph[10];
bool isVisited[10] = { false };
void bfs(int start) {
//BFS (너비 우선 탐색)
queue <int> q;
//초기화: 시작 노드를 큐에 넣고, 방문 표시
q.push(start);
isVisited[start] = true;
//큐가 빌 때까지 과정 반복
while (!q.empty()) {
//가장 먼저 들어간 q값 추출 후 삭제
int x = q.front();
q.pop();
cout << x << " " << endl;
//아직 방문하지 않은 노드 탐색
for (int i = 0; i < graph[x].size(); i++) {
int y = graph[x][i];
if (!isVisited[y]) {
q.push(y);
isVisited[y] = true;
}
}
}
}
int main() {
cin.tie(NULL);
cout.tie(NULL);
// 노드 1에 연결된 노드 정보 저장
graph[1].push_back(2);
graph[1].push_back(3);
graph[1].push_back(8);
// 노드 2에 연결된 노드 정보 저장
graph[2].push_back(1);
graph[2].push_back(7);
// 노드 3에 연결된 노드 정보 저장
graph[3].push_back(1);
graph[3].push_back(4);
graph[3].push_back(5);
// 노드 4에 연결된 노드 정보 저장
graph[4].push_back(3);
graph[4].push_back(5);
// 노드 5에 연결된 노드 정보 저장
graph[5].push_back(3);
graph[5].push_back(4);
// 노드 6에 연결된 노드 정보 저장
graph[6].push_back(7);
// 노드 7에 연결된 노드 정보 저장
graph[7].push_back(2);
graph[7].push_back(6);
graph[7].push_back(8);
// 노드 8에 연결된 노드 정보 저장
graph[8].push_back(1);
graph[8].push_back(7);
bfs(1);
}
'c++ 개념' 카테고리의 다른 글
| [c++/STL] 교집합, 합집합 구하기 (1) | 2024.12.16 |
|---|---|
| [c++/알고리즘] DFS 개념 및 예제 (1) | 2024.11.13 |
| [c++/알고리즘] next_permutation (순열) (1) | 2024.10.22 |
| [c++/알고리즘] transform 사용법 (1) | 2024.10.17 |
| [c++/클래스] 클래스의 생성자와 소멸자 (1) | 2024.10.01 |