1. DFS(Depth First Search) ; 깊이 우선 탐색
깊이를 우선으로 탐색하는 알고리즘.
struct Vertex
{
};
vector<Vertex> vertices;
vector<vector<int>> adjacent;
vector<bool> visited;
void CreateGraph()
{
vertices.resize(6);
adjacent = vector<vector<int>>(6);
adjacent[0].push_back(1);
adjacent[0].push_back(3);
adjacent[1].push_back(0);
adjacent[1].push_back(2);
adjacent[1].push_back(3);
adjacent[3].push_back(4);
adjacent[5].push_back(4);
}
위의 그래프 사진과 같이 정점들과 연결 상태를 만들어 준다.
그리고 이미 방문한 정점인지 채크하는 visited boolean벡터를 만들어준다.
int main()
{
CreateGraph();
visited = vector<bool>(6, false);
Dfs(0);
}
(1) 인접 리스트 방법
해당 정점을 방문했는지 배열로 관리한다.
모든 인접한 정점들을 순회한다. 재귀 함수를 이용한다.
void Dfs(int here)
{ // 방문했음을 체크
visited[here] = true;
// 인접한 모든 길을 방문
for (int i = 0; i < adjacent[here].size(); i++)
{ // 목적지
int there = adjacent[here][i];
if (visited[there] == false)
Dfs(there);
}
}
또한 아래 함수를 통해서 방문하지 않은 탐색 정점(연결되지 않아 떨어져 있는 정점)도 탐색을 실시한다.
void DfsAll()
{
for (int i = 0; i < 6; i++)
{
if (visited[i] == false)
Dfs(i);
}
}
(2) 인접 행렬 방법
void CreateGraph()
{
vertices.resize(6);
adjacent = vector<vector<int>>(6);
adjacent = vector<vector<int>>
{
{ 0, 1, 0, 1, 0, 0},
{ 1, 0, 1, 1, 0, 0},
{ 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 1, 0},
{ 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 1, 0},
};
}
void Dfs(int here)
{ // 방문했음을 체크
visited[here] = true;
for (int there = 0; there < 6; there++)
{
if (adjacent[here][there] == 0)
continue;
// 아직 방문하지 않은 곳이 있으면 방문해야 함
if (visited[there] == false)
Dfs(there);
}
}
'자료구조와 알고리즘 > 선형 자료구조 & 그래프' 카테고리의 다른 글
2-5. 다익스트라(Dijkstra) 알고리즘 (0) | 2023.07.07 |
---|---|
2-3. BFS - 너비 우선 탐색 (0) | 2023.07.06 |
2-1. 그래프 기초 (0) | 2023.07.06 |
1-8. 오른손 법칙 개선하기 (0) | 2023.07.04 |
1-7. 큐(Queue) (0) | 2023.07.04 |