https://gmlwjd9405.github.io/2018/08/15/algorithm-bfs.html
그래프 탐색이란?
- 하나의 정점으로 부터 시작하여 차례대로 모든 정점들을 한번 씩 방문하는 것
EX) 특정 도시에서 다른 도시로 갈 수 있는지 없는지, 전자 회로에서 특정 단자와 단자가 서로 연결되어 있는 지
루트 노드(혹은 다른 임의의 노드)에서 시작해서 인접한 노드를 먼저 탐색하는 방법
깊이가 1인 모든 노드를 방문하고 나서 그 다음에는 깊이가 2인 모든 노드를, 그 다음에는 깊이가 3인 모든 노드를 방문하는 식으로 계속 방문하다가 더이상 방문할 곳이 없으면 탐색을 마친다.
void bfs(Node root){
Queue queue = new Queue();
root.marked = true; //방문한 노드 체르
queue.enqueue(root); //1-1. 큐의 끝에 추가
//3. 큐가 소진될때까지 계속
while(!queue.isEmpty()){
Node r= queue.dequeue(); //큐의 앞에서 노드 추출
visit(r); //2-1. 큐에서 추출한 노드 방문
//2-2. 큐에서 꺼낸 노드와 인접한 노드들을 모두 차례로 방문
foreach(Node n in r.adjacent){
if(n.marked == false){
n.marked = true;
queue.enqueue(n);
}
}
}
}
#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <queue>
#define MAXV 5
using namespace std;
vector<int> adj[MAXV]; //그래프의 연결 관계를 인접리스트로 저장
int visit[MAXV] = { 0 }; // 노드 i를 방문한 적이 있으면 1, 없으면 0
void bfs(int start) {
queue<int> q;
//시작 노드의 번호 0이라고 가정
q.push(start);
visit[start] = 1;
//queue가 비어있지 않은 동안
while (!q.empty()) {
//queue의 가장 앞에 있는 노드를 pop
int here = q.front();
q.pop();
printf("%d ", here);
//현재 노드에 인접한 모든 노드들 중
for (int i = 0; i < adj[here].size(); i++) {
int there = adj[here][i];
//아직 방문하지 않은 노드들을 queue에 push
if (visit[there] == 0) {
q.push(there);
visit[there] = 1;
}
}
}
}
int main() {
adj[0].push_back(1);
adj[1].push_back(0);
adj[0].push_back(2);
adj[2].push_back(0);
adj[0].push_back(4);
adj[4].push_back(0);
adj[1].push_back(2);
adj[2].push_back(1);
adj[2].push_back(3);
adj[3].push_back(2);
adj[2].push_back(4);
adj[4].push_back(2);
adj[3].push_back(4);
adj[4].push_back(3);
bfs(0);
return 0;
}