반응형
깊이 우선 탐색 (DFS, Depth-First Search)
깊이 우선 탐색(DFS)은 그래프 탐색 알고리즘 중 하나로, 가능한 한 깊게 탐색한 후 더 이상 깊이 갈 수 없으면 다시 되돌아와 다른 경로를 탐색하는 방식입니다. DFS는 스택 자료구조를 사용하여 구현할 수 있으며, 재귀적으로도 구현이 가능합니다.
DFS의 주요 특징:
- 시간 복잡도: (O(V + E)), 여기서 (V)는 정점의 수, (E)는 간선의 수입니다.
- 공간 복잡도: (O(V)), 재귀 호출 스택의 깊이입니다.
DFS 구현
그래프 구현 (인접 리스트 사용)
#include <iostream>
#include <vector>
#include <list>
// 그래프 클래스 정의
class Graph {
public:
Graph(int vertices);
void addEdge(int v, int w); // 간선 추가
void DFS(int v); // DFS 호출
private:
int vertices; // 정점의 수
std::vector<std::list<int>> adjList; // 인접 리스트
void DFSUtil(int v, std::vector<bool>& visited); // DFS 유틸리티 함수
};
// 그래프 생성자 정의
Graph::Graph(int vertices) {
this->vertices = vertices;
adjList.resize(vertices);
}
// 간선 추가 함수 정의
void Graph::addEdge(int v, int w) {
adjList[v].push_back(w); // 정점 v에 정점 w를 추가
}
// DFS 유틸리티 함수 정의
void Graph::DFSUtil(int v, std::vector<bool>& visited) {
// 현재 노드를 방문한 것으로 표시하고 출력
visited[v] = true;
std::cout << v << " ";
// 현재 노드와 인접한 모든 노드를 재귀적으로 방문
for (auto i = adjList[v].begin(); i != adjList[v].end(); ++i) {
if (!visited[*i]) {
DFSUtil(*i, visited);
}
}
}
// DFS 호출 함수 정의
void Graph::DFS(int v) {
std::vector<bool> visited(vertices, false); // 모든 노드를 방문하지 않은 상태로 초기화
// DFS 유틸리티 함수 호출
DFSUtil(v, visited);
}
// 메인 함수
int main() {
Graph g(4);
g.addEdge(0, 1);
g.addEdge(0, 2);
g.addEdge(1, 2);
g.addEdge(2, 0);
g.addEdge(2, 3);
g.addEdge(3, 3);
std::cout << "정점 2에서 시작하는 깊이 우선 탐색: ";
g.DFS(2);
return 0;
}
설명
- 그래프 클래스:
vertices
: 그래프의 정점 수.adjList
: 각 정점의 인접 리스트를 저장하는 벡터.
- addEdge 함수:
- 정점 v에서 정점 w로의 간선을 그래프에 추가합니다.
- DFSUtil 함수:
- 현재 노드를 방문한 것으로 표시하고, 인접한 모든 노드를 재귀적으로 방문합니다.
- DFS 함수:
- 주어진 시작 정점에서 DFS를 수행합니다.
- 방문 여부를 추적하기 위해
visited
벡터를 사용합니다.
DFS의 기본 개념과 구현 방법을 이해했습니다. 다음 단계로 넘어가며, 더 복잡한 탐색 알고리즘과 다양한 알고리즘을 학습해보겠습니다.
질문이나 피드백이 있으면 언제든지 댓글로 남겨 주세요. 내일은 "Day 24: 너비 우선 탐색 (BFS)"에 대해 학습하겠습니다.
반응형
'-----ETC----- > C++로 배우는 알고리즘과 자료구조 시리즈' 카테고리의 다른 글
[C++로 배우는 알고리즘과 자료구조] Day 25: 다익스트라 알고리즘 (Dijkstra's Algorithm) (0) | 2024.08.01 |
---|---|
[C++로 배우는 알고리즘과 자료구조] Day 26: 플로이드-워셜 알고리즘 (Floyd-Warshall Algorithm) (0) | 2024.08.01 |
[C++로 배우는 알고리즘과 자료구조] Day 24: 너비 우선 탐색 (BFS) (0) | 2024.08.01 |
[C++로 배우는 알고리즘과 자료구조] Day 22: 이진 탐색 (Binary Search) (0) | 2024.08.01 |
[C++로 배우는 알고리즘과 자료구조] Day 20: 힙 정렬 (Heap Sort) (0) | 2024.08.01 |