공부용 이모저모
DFS/BFS(깊이우선/너비우선 탐색) 공부 본문
DFS - 깊이 우선 탐색
연결된 노드를 계속 들어가며 재귀호출한다.
#include<iostream>
#include<queue>
#include<vector>
using namespace std;
bool visit[10] = { false }; //방문여부
vector<int> map[10];
int num;
#pragma warning(disable:4996)
void dfs(int v)
{
//방문하지 않은것만 체크한다
if (visit[v])
return;
visit[v] = true;
printf("%d", v);
for (int i = 0; i < map[v].size(); i++)
{
int tmp = map[v][i];
//재귀함수로 다음으로 넘어간다.
dfs(tmp);
}
}
//양쪽 노드를 연결해준다
void AddLine(int a, int b)
{
map[a].push_back(b);
map[b].push_back(a);
}
int main(void) {
AddLine(1, 2);
AddLine(1, 3);
AddLine(2, 4);
AddLine(2, 5);
AddLine(5, 8);
AddLine(3, 6);
AddLine(6, 9);
AddLine(3, 7);
//1번 노드로부터 BFS 탐색
dfs(1);
return 0;
}
이렇게 모든 방문을 마칠 경우의 순서는 1 2 4 5 8 3 6 9 7이 된다.
BFS - 너비 우선 탐색
큐를 사용해서 루트 노드에 연결되어있는 모든 노드를 다 탐색한 뒤 깊이로 들어간다.
#include<iostream>
#include<queue>
#include<vector>
using namespace std;
bool visit[10] = { false }; //방문여부
vector<int> map[10];
queue<int> q;
int num;
#pragma warning(disable:4996)
void bfs(int v)
{
q.push(v);
visit[v] = true;
while (!q.empty()) //큐에 값이 없어질 때까지 반복한다
{
int node = q.front();
q.pop();
printf("%d", node);
for (int i = 0; i < map[node].size(); i++)
{
int tmp = map[node][i];
if (visit[tmp] == false)
{
q.push(tmp);
visit[node] = true;
}
}
}
}
//양쪽 노드를 연결해준다
void AddLine(int a, int b)
{
map[a].push_back(b);
map[b].push_back(a);
}
int main(void) {
AddLine(1, 2);
AddLine(1, 3);
AddLine(2, 4);
AddLine(2, 5);
AddLine(5, 8);
AddLine(3, 6);
AddLine(6, 9);
AddLine(3, 7);
//1번 노드로부터 BFS 탐색
bfs(1);
return 0;
}
이 순서대로 빼면 1 2 3 4 5 6 7 8 9 순으로 pop된다.
'C++' 카테고리의 다른 글
메모리 단편화 & 메모리 풀 (0) | 2021.08.06 |
---|---|
A* 알고리즘 공부 (0) | 2021.08.04 |