반응형
1. DFS / BFS 란?
DFS와 BFS는 그래프에서 사용하는 대표적인 탐색 알고리즘이다.
방법의 차이는 있지만, 두 알고리즘 모두 한 노드에서부터 시작해 그 노드에 연결된 모든 노드를 탐색한다.
DFS와 BFS가 무엇인지, 사용되는 기술은 무엇인지 알아보자.
(1) DFS
DFS는 'Depth First Search' 의 줄임말이다. 해석하자면 '깊이 우선 탐색' 이라고 할 수 있겠다.
즉, 한 노드를 집중적으로 파고들어, 그 노드에 연결된 노드를 깊숙이 들어가보는 것이다.
그렇기 때문에 DFS를 위해서는 스택이 사용된다.
DFS를 C++과 STL로 구현한 코드는 다음과 같다.
#include <iostream>
#include <stack>
using namespace std;
void DFS(vector<vector<int>> v, int start)
{
stack<int> s;
int *visited;
visited = new int[v.size()];
memset(visited, 0, sizeof(int)* v.size());
int curNode = start;
s.push(start);
visited[start] = 1;
cout << start + 1;
while (!s.empty())
{
curNode = s.top();
s.pop();
for (int i = 0; i < v[curNode].size(); i++)
{
if (visited[v[curNode][i]] == 0)
{
cout << " " << v[curNode][i] + 1;
visited[v[curNode][i]] = 1;
s.push(curNode);
s.push(v[curNode][i]);
break;
}
}
}
cout << '\n';
}
(2) BFS
BFS는 'Breath First Search' 의 줄임말이다. 해석하자면 '너비 우선 탐색' 이라고 할 수 있겠다.
즉, 한 노드에서 갈라지는 갈래를 하나 하나 넓게 탐색해보는 방법이다.
그렇기 때문에 DFS를 위해서는 큐가 사용된다.
BFS를 C++과 STL로 구현한 코드는 다음과 같다.
#include <iostream>
#include <queue>
using namespace std;
void BFS(vector<vector<int>> v, int start)
{
queue<int> q;
bool *visited;
visited = new bool[v.size()];
memset(visited, 0, sizeof(bool)*v.size());
q.push(start);
visited[start] = 1;
int curNode;
cout << start + 1;
while (!q.empty())
{
curNode = q.front();
q.pop();
for (int i = 0; i < v[curNode].size(); i++)
{
if (visited[v[curNode][i]] == false)
{
cout << " " << v[curNode][i] + 1;
visited[v[curNode][i]] = true;
q.push(v[curNode][i]);
}
}
}
cout << '\n';
}
2. DFS / BFS 사용할 때의 주의사항
이 내용은 본인이 코딩하면서 겪었던 문제에 대한 내용이므로 스킵해도 좋다.
- vector 형태로 간선들을 입력해주었을 때는, 오름차순으로 각 vector들을 sort한 후 하는 것이 좋다.
- 단방향 / 양방향의 내용을 잘 확인하고 문제를 풀자.
반응형
'Programming > 알고리즘' 카테고리의 다른 글
[알고리즘] 효율적으로 약수를 찾는 알고리즘 (1) | 2020.08.31 |
---|---|
[알고리즘] 가장 빠른 소수 구하기 - 에라토스테네스의 체 (0) | 2020.06.08 |
[알고리즘] C++로 N-Queen 문제풀기 (Back-Tracking 알고리즘) (0) | 2020.05.12 |
[알고리즘] C++로 벨만-포드 알고리즘 구현하기 (0) | 2019.12.05 |
[알고리즘] C++로 다익스트라 알고리즘 구현하기 (0) | 2019.12.05 |