728x90
너비 우선 탐색이란?
-큐를 이용한 탐색 방법으로 한 노드로부터 이동할 수 있는 노드들을 큐에 넣어서 탐색하는 방법이다.
-DFS와 달리 깊이 들어가지 않음으로 구하려는 해가 깊이 들어있지 않을 때 효율적이다.
-DFS와 달리 반복문을 통해서 구현한다.
개념 설명
위와 같은 루트가 1인 트리가 있다. 이 트리를 큐의 변화와 탐색 순서를 보면서 이해해보자.
-처음 루트 1을 방문했을 때
큐
2 | 3 |
---|
트리
-큐에 있는 노드인 노드 2와 노드 3을 방문하고 노드 2와 노드 3에 연결된 노드들을 큐에 넣는다.
큐
5 | 4 | 9 | 6 |
---|
트리
-큐에 있는 노드들 방문 후 자식 노드들을 똑같이 큐에 넣는다.
큐
7 | 8 | 10 |
---|
트리
-큐에 있는 나머지 노드들 방문
큐
트리
탐색 완료!
탐색 순서 1-2-3-5-4-9-6-7-8-10
코드
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
vector <int> adj[10001];
int N,M;
bool visit[10001] = {false};
void BFS(int node){
queue<int> q;
q.push(node);
while(!q.empty()){
node = q.front();
q.pop();
if(visit[node]){continue;}
visit[node] = true;
cout << node << "\n";
for(int i = 0;i<adj[node].size();i++){
q.push(adj[node][i]);
}
}
}
int main(void){
// 입력
// 10 9
cin >> N >> M;
for(int i = 0;i<M;i++){
int a,b;
/*
입력
1 2
3 1
5 2
2 4
4 7
8 4
9 3
6 3
6 10
*/
cin >> a >> b;
adj[a].push_back(b);
adj[b].push_back(a);
}
BFS(1);
}
|
cs |
728x90
'그래프 이론 > BFS, DFS 알고리즘' 카테고리의 다른 글
[백준/C++][말이 되고픈 원숭이 - 1600번] (0) | 2021.11.25 |
---|---|
[C++][DFS(깊이 우선탐색) 알고리즘] (0) | 2020.12.04 |
[백준/C++][나이트의 이동(7562번)] (0) | 2020.12.02 |
[백준/C++][연결 요소의 개수(11724번)] (0) | 2020.12.01 |
[백준/C++][인구이동(16234번)] (0) | 2020.11.28 |