자료구조
C++) DFS 기본형
HSH12345
2023. 11. 6. 22:41
#include <iostream>
#include <cstring>
#include <stack>
using namespace std;
#define MAX_COUNT 10
int _nodeNum, _edgeNum;
int _arrGraph[MAX_COUNT][MAX_COUNT];
bool _arrVisited[MAX_COUNT];
// 선언부
void DFS_Recursion(int firstNodeNum);
void DFS_Stack(int firstNodeNum);
int main()
{
cin >> _nodeNum >> _edgeNum;
memset(_arrVisited, 0, sizeof(_arrVisited));
memset(_arrGraph, 0, sizeof(_arrGraph));
for (int i = 0; i < _edgeNum; i++)
{
int u, v;
cin >> u >> v;
// 방향성이 없으므로 대칭되는 배열의 값을 전부 1로 마킹
_arrGraph[u][v] = _arrGraph[v][u] = 1;
}
DFS_Recursion(0);
DFS_Stack(0);
return 0;
}
// 정의부
void DFS_Recursion(int firstNodeNum)
{
// 방문 기록 마킹
_arrVisited[firstNodeNum] = true;
cout << firstNodeNum << ' ';
for (int nextNodeNum = 1; nextNodeNum < _nodeNum; nextNodeNum++)
{
if (!_arrVisited[nextNodeNum] && // 해당 노드를 방문한 적있는가?
_arrGraph[firstNodeNum][nextNodeNum]) // 해당 노드가 연결되어 있는가?
{
DFS_Recursion(nextNodeNum);
}
}
}
void DFS_Stack(int firstNodeNum)
{
bool arrVisited[MAX_COUNT] = { false };
stack<int> stackDFS;
stackDFS.push(firstNodeNum);
while (!stackDFS.empty())
{
int curNodeNum = stackDFS.top();
stackDFS.pop();
if (arrVisited[curNodeNum])
{
continue;
}
arrVisited[curNodeNum] = true;
cout << curNodeNum << ' ';
for (int nextNodeNum = 1; nextNodeNum < _nodeNum; nextNodeNum++)
{
if (!arrVisited[nextNodeNum] && _arrGraph[curNodeNum][nextNodeNum])
{
stackDFS.push(nextNodeNum);
}
}
}
}
memset:
void *memset(void *ptr, int value, size_t num);
cstring 헤더파일에 정의되어 ptr로 지정된 주소에서 시작하는 num 바이트의 메모리를 value로 변환된 값으로 채운다.
int arr[100];
memset(arr, 0, sizeof(arr));
int 배열을 0으로 초기화하고 싶을 때 memset을 사용할 수 있다.