[알고리즘] BFS

정태규·2023년 3월 27일
0

알고리즘

목록 보기
1/15
post-thumbnail

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

탐색을 할때 너비를 우선으로 하여 탐색하는 알고리즘이다.

특히나 맹목적인 탐색을 하고자 할때 사용할 수 있다.

최단경로를 찾고 싶을 때 사용한다.

Queue를 사용하면 쉽게 찾을 수 있다.

BFS를 수행하는 과정을 보자

간략하게 말하자면, queue에서 pop한 수의 가장 가까운 길이의 수중 한번도 들른적 없는 수를 queue에 push하면 된다.

예를 들어보자.

1 ~ 7 까지의 수가 있다.

먼저 1을 que 에 넣는다.
1을 pop한다.
1에서 가장 가까운 수인 2,3을 큐에 넣는다.

dequeue : 1
que :2,3

2를 pop한다. 2와 가장 가까운 수인 4,5를 push 한다.

dequeue:1,2
queue : 3,4,5

3을 pop한다. 3과 가장 까가운 수인 6,7을 push 한다.

dequeue:1,2,3
queue: 4,5,6,7

4,5,6,7을 pop해준다.


#include <iostream>
#include <queue>
#include <vector>

using namespace std;

int number = 7; //원소의 개수가 7개  
int c[7]; //방문처리를 위한 check 배열
vector<int> a[8]; // 1~7까지 index를 처리하기 위함. 

void bfs(int start){
    queue<int> q;
    q.push(start);
    c[start] = true;
    
    
    
    while(!q.empty()){
    
        int x = q.front();
        q.pop();
        printf("%d",x);
        
        //q에서 꺼낸 인접한 노드 하나씩 방문 
        for(int i = 0; i < a[x].size(); i++){
            //현재노드 x에서 인접노드 방문
            //y는 방문할 노드
            int y = a[x][i];
            //인접한 노드를 방문한 상태라면 무시 아니면 q에 담아준다.
            if(!c[y]){
                q.push(y);
                c[y] = true;
                
            }
            
        }
    }
    
}

int main()
{
    //1과 2를 연결
    a[1].push_back(2);
    a[2].push_back(1);
    //1과3연결
    a[1].push_back(3);
    a[3].push_back(1);
    //2와4연결
    a[2].push_back(4);
    a[4].push_back(2);
    //2와5연결
    a[2].push_back(5);
    a[5].push_back(2);
    //3과6연결
    a[3].push_back(6);
    a[6].push_back(3);
    //3과7연결
    a[3].push_back(7);
    a[7].push_back(3);
    
    //4와5연결
    a[4].push_back(5);
    a[5].push_back(4);
    
    //6과7연결
    a[6].push_back(7);
    a[7].push_back(6);
    
    bfs(1);
    
    return 0;
}

0개의 댓글