본문 바로가기
CS/Algorithm

BFS(Breadth First Search) 너비 우선 탐색

by chuckolet 2019. 1. 30.

Introduction

BFS: 한 우물만 파는 DFS와는 대조적으로, 모든 곳을 똑같이 조금씩 파는 성향
 
역시 자세한 내용은 여기를 참고하세요.

DFS에서는 최근에 방문한 노드부터 보지만, BFS는 먼저 방문한 노드들부터 보기 때문에 Queue를 이용합니다.

1. 시작점을 큐에 넣고 방문했다고 표시
2. 큐가 비어있지 않을 때까지 adj(인접행렬) 방문을 시도
3. 아직 방문하지 않은 노드일 경우 방문했다고 표시하고 큐에 넣어줌

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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
 
class Graph {
public:
    int N; // 정점의 개수
    vector<vector<int>> adj; // 인접 리스트
 
    // 생성자
    Graph(): N(0){}
    Graph(int n): N(n){
        adj.resize(n);
    }
 
    // 간선 추가 함수
    void addEdge(int i, int j) {
        adj[i].push_back(j);
        adj[j].push_back(i);
    }
 
    // 모든 리스트의 인접한 정점 번호 정렬
    void sortList() {
        for(int i=0; i<N; i++) {
            sort(adj[i].begin(), adj[i].end());
        }
    }
 
    void bfs() {
        vector<bool> visited(N, false); // 방문 여부를 저장하는 배열
        queue<int> Q;
        Q.push(0);
        visited[0= true;
 
        while(!Q.empty()) {
            int curr = Q.front();
            Q.pop();
            cout << "Node " << curr << " visited" << endl;
            for(int next: adj[curr]) {
                if(!visited[next]) {
                    visited[next] = true;
                    Q.push(next);
                }
            }
         }
    }
};
 
int main() {
    Graph G(9);
    G.addEdge(01);
    G.addEdge(02);
    G.addEdge(13);
    G.addEdge(15);
    G.addEdge(34);
    G.addEdge(45);
    G.addEdge(26);
    G.addEdge(28);
    G.addEdge(67);
    G.addEdge(68);
    G.sortList();
    G.bfs();
}
cs


위의 코드를 대략적으로 도식화 한 그림입니다.



References

example reference


제 글이 도움이 되셨다면 간단하게 '공감', '댓글' 부탁드립니다!



'CS > Algorithm' 카테고리의 다른 글

DFS(Depth First Search) 깊이 우선 탐색  (0) 2019.01.29

댓글