1. Breadth First Search (BFS, 너비 우선 탐색
1. 완전 탐색 알고리즘
- 모든 경우의 수를 탐색하는 알고리즘
2. 시작점에서 가까운 점부터 탐색하는 방식
- 개미굴에 물을 부어서 물이 점점 안 쪽으로 스며들어가는 방식과 비슷하다.
2. 장점
1) 출발노드에서 목표 노드까지의 최단 길이 경로를 보장한다.
3. 단점
1) 경로가 매우 길 경우에는 탐색 기지가 급격히 증가하여 많은 기억 공간을 필요로 한다.
4. 구현
- Queue를 통해 구현
- 아래 3가지 구조로 나눌 수 있다.
1) 시작점 셋팅
2) 현재 방문 노드를 Queue에서 pop하기
3) 다음으로 방문할 노드 Queue에 삽입
#include <iostream>
#include <vector>
#include <queue>;
using namespace std;
bool visited[11];
vector<int> graph[11];
void bfs(int start_node)
{
// 1. 시작점 세팅
queue<int> q;
q.push(start_node);
visited[start_node] = true; // 방문 여부 체크
while (!q.empty())
{
// 2. 현재 방문 노드를 Queue에서 pop하기
int current_node = q.front();
q.pop();
cout << current_node << " ";
// 3. 다음으로 방문할 노드 Queue에 삽입
for (int index = 0; index < graph[current_node].size(); index++) {
int next_node = graph[current_node][index];
if (visited[next_node]) continue;
visited[next_node] = true;
q.push(next_node);
}
}
}
int main() {
// graph 생성
graph[1].push_back(2);
graph[1].push_back(3);
graph[2].push_back(4);
graph[2].push_back(5);
graph[3].push_back(6);
graph[3].push_back(7);
graph[5].push_back(8);
// BFS (넓이 우선 탐색) 알고리즘
bfs(1);
return 0;
}
5. BFS(너비 우선 탐색) 문제 모음집
https://www.acmicpc.net/problem/14940
14940번: 쉬운 최단거리
지도의 크기 n과 m이 주어진다. n은 세로의 크기, m은 가로의 크기다.(2 ≤ n ≤ 1000, 2 ≤ m ≤ 1000) 다음 n개의 줄에 m개의 숫자가 주어진다. 0은 갈 수 없는 땅이고 1은 갈 수 있는 땅, 2는 목표지점이
www.acmicpc.net
https://www.acmicpc.net/problem/21736
21736번: 헌내기는 친구가 필요해
2020년에 입학한 헌내기 도연이가 있다. 도연이는 비대면 수업 때문에 학교에 가지 못해 학교에 아는 친구가 없었다. 드디어 대면 수업을 하게 된 도연이는 어서 캠퍼스 내의 사람들과 친해지고
www.acmicpc.net
https://www.acmicpc.net/problem/2206
2206번: 벽 부수고 이동하기
N×M의 행렬로 표현되는 맵이 있다. 맵에서 0은 이동할 수 있는 곳을 나타내고, 1은 이동할 수 없는 벽이 있는 곳을 나타낸다. 당신은 (1, 1)에서 (N, M)의 위치까지 이동하려 하는데, 이때 최단 경로
www.acmicpc.net
https://www.acmicpc.net/problem/14502
14502번: 연구소
인체에 치명적인 바이러스를 연구하던 연구소에서 바이러스가 유출되었다. 다행히 바이러스는 아직 퍼지지 않았고, 바이러스의 확산을 막기 위해서 연구소에 벽을 세우려고 한다. 연구소는 크
www.acmicpc.net
https://www.acmicpc.net/problem/12851
12851번: 숨바꼭질 2
수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때
www.acmicpc.net
https://www.acmicpc.net/problem/16946
16946번: 벽 부수고 이동하기 4
N×M의 행렬로 표현되는 맵이 있다. 맵에서 0은 이동할 수 있는 곳을 나타내고, 1은 이동할 수 없는 벽이 있는 곳을 나타낸다. 한 칸에서 다른 칸으로 이동하려면, 두 칸이 인접해야 한다. 두 칸이
www.acmicpc.net
'알고리즘' 카테고리의 다른 글
[알고리즘] 누적 합 (0) | 2024.04.11 |
---|---|
[알고리즘] 그리디 알고리즘 (1) | 2024.04.06 |
[알고리즘] DFS (깊이 우선 탐색) (1) | 2024.04.03 |
[알고리즘] 배낭 문제 (1) | 2024.04.03 |
[기타] 주어진 수열에서 선택한 3개의 값의 합이 0에 가장 가깝게 선택하는 방법 (1) | 2023.10.03 |