저번 글에 이어 이번 글에서는 그래프를 읽어온 결과를 바탕으로 그래프 상에서 dfs를 해보겠다.
0. 그래프 구조
먼저, 저번 글에서 사용한 그래프 구조를 직접 그리면 다음과 같다.
1. dfs 코드
dfs는 Depth-First-Search의 약자로 현재 정점에서 다음 정점으로 갈 수 있는 경우, 탐색을 계속하며 다음 정점이 없는 경우에는 부모 정점으로 돌아가 다시 갈 수 있는 정점가 있는지 판단한다.
다음 정점이 있는 경우 계속해서 탐색을 하기 때문에 트리에서 탐색할 경우, 루트 노드에서 계속해서 높이를 내려가면서 탐색을 하므로 dfs라는 이름이 붙었다.
코드 전반은 다음과 같다.
int dfs(vector<vector<int>> &graph, vector<int>& visited, int n){
cout << "Vertex " << n << "\n";
visited[n - 1] = 1;
for(int i = 0; i < graph[n - 1].size(); i++){
int idx = graph[n - 1][i];
if(!visited[idx - 1]){
dfs(graph, visited, idx);
}
}
return 0;
}
그래프 정보를 저장하는 이차원 배열 graph와 방문 여부를 저장하는 배열visited, 현재 정점 번호를 저장하는 idx 변수를 매개변수로 가진다.
재귀함수를 이용해 코드를 구현했으며(스택을 이용해도 가능하다) 정점을 방문할 시 현재 정점에 방문처리를 한다.
그리고 현재 정점에 연결된 다른 정점들을 방문했는지 체크하며, 만약 방문하지 않았다면 그 정점을 방문한다.
결과는 다음과 같다.
8번 정점에서 5번 정점으로 가는 이유는, 8번 정점에서 5번 정점으로 갈 수 있기 때문이다.
dfs는 높이가 위에서 아래로 내려가는 것만이 아니라, 다음에 갈 수 있는 정점이 있는지 여부를 가지고 탐색을 계속한다.
LIST
'Programming Language > C, C++' 카테고리의 다른 글
[C++] 파일 입출력 - 텍스트 파일 읽기 [1] (0) | 2022.12.21 |
---|---|
[Quick Note] swap 함수를 구현하는 세 가지 방법 (C++) (0) | 2022.11.14 |
[C++] list 자료형 사용하기 - Quick Note (2) | 2022.09.23 |
[C++] int와 string 사이 형변환 방법 (0) | 2022.09.02 |