- DFS는 스택 or 재귀 이용해서 푼다
1. 스택을 활용한 DFS
- 탐색 전 시작 노드 정하기
- 스택에 시작 노드를 Push
- 스택에 있는 노드는 방문 안 한 노드 && 방문 예정 노드임
- 스택이 비었는지 확인
- -> 비었으면 모두 방문한거니까 탐색 종료
- 스택에서 노드 팝
- -> 팝한 원소는 최근 스택에 푸시한 노드
- 팝한 노드의 방문 여부 확인
- -> 안했으면 방문
- 방문한 노드와 인접 모든 노드 확인
- -> 안 했으면 노드를 스택에 푸시
1.1. 그림으로 보는 스택으로 만드는 DFS










1.2. 코드로 구현한 DFS
- sort함수 쓰려고 algorithm 추가했당.
#include <iostream>
#include <vector>
#include <stack>
#include <algorithm>
using namespace std;
// 인접 리스트
vector<vector<int>> AdjList;
// 방문 여부
vector<bool> bVisited;
//---------------------------------------------------
void DFS(int NodeNum)
{
stack <int> St;
St.push(NodeNum);
while (!St.empty())
{
int Current = St.top();
St.pop();
if(!bVisited[Current])
{
bVisited[Current] = true;
cout << Current << " 방문완료" << endl;
}
vector<int> NodesClosed = AdjList[Current];
sort(NodesClosed.rbegin(), NodesClosed.rend());
for (int NodeClosed : NodesClosed)
{
if (!bVisited[NodeClosed])
{
St.push(NodeClosed);
}
}
}
}
//---------------------------------------------------
int main()
{
int numNodes = 5;
AdjList.resize(numNodes + 1); // 인덱스 1부터 사용
bVisited.resize(numNodes + 1, false);
// 간선 추가 (인접 리스트로 그래프 생성)
AdjList[1] = { 4, 5 };
AdjList[5] = { 1, 4 };
AdjList[4] = { 2, 3};
AdjList[2] = { 3, 4};
AdjList[3] = { 2, 4};
// DFS 탐색 시작
DFS(1);
return 0;
}

2. 재귀함수를 이용한 DFS
- 스택 안 쓰고 재귀함수 써서 DFS 구현할 수 있음 왜?
- 왜냐면 재귀함수 Call할 때마다 Call한 함수가 시스템 스택에 쌓여서 ㅋㅋ
'알고리즘(C++)' 카테고리의 다른 글
그래프 탐색 - 너비 우선 탐색(BFS) (0) | 2025.02.05 |
---|---|
그래프 탐색 - DFS vs BFS (0) | 2025.02.04 |
그래프 (0) | 2025.02.04 |
유니온 파인드 알고리즘 (0) | 2025.02.03 |
배열 - 두개 뽑아서 더해서 정렬하기 (0) | 2025.01.30 |