루트 노드(or 임의의 노드)에서 시작해서 인접한 노드를 먼저 탐색하는 방법
방문한 노드들을 차례로 저장한 후, 꺼낼 수 있는 자료구조인 큐(Queue)를 사용한다.
→ 선입선출(FIFO) 원칙으로 탐색한다.
직관적이지 않다. 시작 노드에서 시작해서 거리에 따라 단계별로 탐색한다.
재귀적으로 동작하지 않는다.
‘Prim’, ‘Dijkstra’ 알고리즘과 유사하다.
그래프 탐색의 경우, 어떤 노드를 방문했었는지 여부를 반드시 검사해야한다.
(방문 여부를 검사하지 않을 경우 무한 루프에 빠질 위험이 있다.)
O(n^2)
vector<vector<int>> adjacent; // 주어진 인접행렬
vector<int> visited; // 해당 node를 방문했는지 확인
void bfs(int node){
queue<int> q;
q.push(node);
visited[node] = 1;
while(!q.empty()){
node = q.front();
q.pop();
for(int i=0; i<adjacent.size(); i++){
if(!visited[i] && adjacent[node][i]){
q.push(i);
visited[i] = true;
}
}
}
}
O(n+e)
vector<vector<int>> adjacent; // 주어진 인접 리스트
vector<int> visited; // 해당 노드를 방문했는지 확인
void bfs(int node){
queue<int> q;
q.push(node);
visited[node] = 1;
while(!q.empty()){
node = q.front();
q.pop();
for(int i=0; i<adjacent[node].size(); i++){
int next = adjacent[node][i];
if(!visited[next]){
visited[next] = 1;
q.push(next);
}
}
}
}
References:
https://gmlwjd9405.github.io/2018/08/15/algorithm-bfs.html
https://velog.io/@sukong/알고리즘-개념-너비우선탐색BFS-lp8zywtn
https://currygamedev.tistory.com/10