Coding Is My Life

코딩은 인생

그래프 이론/BFS, DFS 알고리즘

[C++][BFS(너비우선탐색) 알고리즘]

산기대 컴공 2020. 12. 6. 10:54
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