Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- graph
- boj #백준
- LIS #가장긴증가하는부분수열 #
- graph #최단경로
- 백준
- 투포인터 #백준 #boj #20922 #22862
- 백준 #다익스트라 #dijkstra #9370 #c++
- 줄어드는수
- 1174
- N번째큰수
- 30870
- 사이클 없는 그래프
- 진법변환 #2to10 #10to2 #이진법 #십진법 #변환 #bitset #c++
- 3D #Reconstruction #computer #vision #volume #metric #tsdf #kinect #fusion
- BOJ
- 호반우 상인
- 레드아보
- 쌤쌤쌤
- 코딩
- c++ #입출력 #속도 #ios #sync_with_stdio #cin #cout #tie
- c++ #boj #
- 최소 #공배수 #최대 #공약수 #유클리드 #호제법 #lcm #gcd #c++ #boj #3343 #백준 #장미
- 22869
- 16202
- hcpc
- C++
- 20117
- 이분탐색 #dp #11053
- 3343
- backtracking #codetree #디버깅 #삼성코테
Archives
- Today
- Total
hyunjin
[C++] BFS 너비 우선 탐색 알고리즘 본문
728x90
너비 우선 탐색 (Breadth - First Search)
개념
BFS(너비우선탐색) : 현재 정점에서 연결된 가까운 점들 부터 탐색
- 가까운 정점 먼저 방문 후 멀리 떨어져 있는 정점 나중에 방문
- 노드를 넓게(wide) 탐색
- 주로 두 노드 사이 최단 경로 혹은 임의의 경로 찾고 싶을 때 사용
- 응용하면 미로찾기 같은 알고리즘도 구현 가능
- 주로 두 노드 사이 최단 경로 혹은 임의의 경로 찾고 싶을 때 사용
BFS 장점
1. 노드 수 적고 깊이 얕은 경우 빠름
2. 단순 검색 속도가 DFS 보다 빠름
3. 너비 우선 탐색하기 때문에 답이 되는 경로가 여러 개인 경우라도 최단 경로임을 보장
4. 최단 경로가 존재한다면 어느 한 경로가 무한히 깊어져도 반드시 최단 경로 찾을 수 있음
BFS 단점
1. 재귀 호출의 DFS 와 달리 큐에 다음에 탐색할 정점들을 저장해야해 저장 공간 많이 필요
2. 노드 수 늘어나면 탐색해야 하는 노드 많아져 비현실적
3. 해가 존재하지 않는 다면 무한 그래프인 경우 해도 못찾고 , 끝내지도 못함. 유한 그래프인 경우엔 모든 그래프 탐색 후 실패로 끝
방법
queue에 이웃하는 정점 담아 놓고 차례대로 Pop 하는 방식으로 구현
구현
- List 나 vector 통해 구현
- v[] : List(or vector)를 통해서 구현한 그래프
- visit[] : 탐색 여부
소스코드
#include <bits/stdc++.h>
// iostream, vecotr ,queue
using namespace std;
const int MAX = 10;
int n,m; // n 정점 개수 , m 간선 개수
vector<int> v[MAX];
int visit[MAX]={0,};
void BFS(int start){
queue<int> q; // queue 생성
q.push(start); //초기 시작점 저장
visit[start]++;
while( !q.empty() ){
// 큐에 값이 있다 => 아직 방문하지 않은 노드가 있다.
int current = q.front();
cout<<current<<" ";
q.pop();
for(int i = 0 ; i < v[x].size();i++){
int next = v[current][i];
if(!visit[next]){
visit[next]=1;
q.push(next);
}
}
}
}
int main(){
cin >> n >> m;
// 그래프 노드 관계 설정
for(int i = 0 ; i < m) {
int a,b;
cin >> a>> b;
v[a].push_back(b);
v[b].push_back(a);
}
BFS();
return 0;
}
참고
728x90
'개인 공부 > 알고리즘' 카테고리의 다른 글
imos 알고리즘 - 누적합 문제 효율적으로 푸는 방법 (0) | 2024.06.30 |
---|---|
[C++] DFS 깊이 우선 탐색 알고리즘 (0) | 2021.02.18 |
유클리드 호제법 알고리즘, 최대공약수, 최소공배수 (0) | 2021.02.16 |
insertion sort(삽입 정렬) 알고리즘 (0) | 2021.02.09 |
Dynamic Programming이란? (0) | 2021.02.03 |