DFS는 그래프의 깊은 부분부터 탐색하는 알고리즘을 의미한다.
깊이 우선 탐색의 과정은 다음과 같다.
- 탐색 시작 노드를 스택에 삽입한 뒤 방문 처리한다.
- 스택의 최상단 노드에 방문하지 않은 인접 노드가 존재하면 해당 노드를 스택에 넣고 방문 처리한다. 방문하지 않은 인접 노드가 없으면 스택에서 최상단 노드를 꺼낸다.
- 2번 과정을 더 이상 수행할 수 없을 때 까지 반복한다.
위 그림을 간단하게 구현하면 아래와 같다.
#include <iostream>
#include <vector>
using namespace std;
vector<int> v[8];
int visited[8];
void DFS(int n)
{
int i;
visited[n] = true; //현재 노드 방문 처리
printf("%d\n", n);
i = 0;
while(i < v[n].size()) //현재 노드와 연결된 노드들을 재귀적으로 방문
{
if (!visited[v[n][i]])
DFS(v[n][i]);
i++;
}
}
int main(void)
{
v[0].push_back(1);
v[0].push_back(2);
v[1].push_back(2);
v[1].push_back(2);
v[2].push_back(3);
v[2].push_back(5);
v[3].push_back(4);
v[7].push_back(6);
DFS(0);
}
BFS는 그래프를 너비를 우선으로 하여 탐색하는 알고리즘을 의미한다.
너비 우선 탐색의 과정은 다음과 같다.
- 탐색 시작 노드를 큐에 삽입하고 방문 처리한다.
- 큐에서 노드를 꺼내 해당 노드의 인접 노드 중에서 방문하지 않은 노드들을 모두 큐에 삽입하고, 방문 처리한다.
- 2번 과정을 더 이상 수행할 수 없을 때 까지 반복한다.
위 그림을 간단하게 구현하면 아래와 같다.
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
vector<int> v[8];
queue<int> q;
int visited[8];
void BFS(int n)
{
int i;
int temp;
visited[n] = true;
q.push(n);
while (!q.empty())
{
temp = q.front();
printf("%d\n", temp);
q.pop();
i = 0;
while (i < v[temp].size())
{
if (!visited[v[temp][i]])
{
visited[v[temp][i]] = true;
q.push(v[temp][i]);
}
i++;
}
}
}
int main(void)
{
v[0].push_back(1);
v[0].push_back(2);
v[1].push_back(2);
v[1].push_back(2);
v[2].push_back(3);
v[2].push_back(5);
v[3].push_back(4);
v[7].push_back(6);
BFS(0);
}