DFS : 깊이 우선 탐색
개요
그래프의 모든 정점을 특정한 순서로 탐색하는 그래프의 탐색 알고리즘 중 하나이다.
정점 1로부터 시작해서 모든 정점을 탐색하기 위한 목적이다.
현재 지점으로부터 인접한 지점을 찾아야 하므로 "재귀" 를 사용한다.
현재 방식은 단순히 "탐색" 만 할 뿐이며, D, F 등의 계산은 하지 않는다.
탐색의 우선순위는 정점의 번호가 작은 순이다.
파란색 정점은 방문 했다는 표시이다.
주황색 정점은 방문한 뒤 되돌아온다는 표시이다.
동작
코드
import java.util.Vector;
public class 깊이_우선_탐색 {
// 그래프의 인접 리스트 표현
static Vector<Vector<Integer>> adj;
// 각 정점을 방문했는지 여부를 나타낸다.
static Vector<Boolean> visited;
// 깊이 우선 탐색의 구현
public static void dfs(int here) {
// here+1은 index가 0부터 시작하기 때문에 편의를 위해 1을 추가해줬다.
System.out.println((here+1) + ": 방문");
visited.set(here, true);
for (int i = 0; i < adj.get(here).size(); i++) {
int there = adj.get(here).get(i);
// 아직 방문한 적이 없다면 방문한다
if (!visited.get(there)) {
dfs(there);
}
}
}
// 모든 정점을 방문한다
public static void dfsAll() {
// visited를 모두 false로 초기화
for (int i = 0; i < adj.size(); i++) {
visited.add(false);
}
// 모든 정점을 순회하면서, 아직 방문한 적 없으면 방문한다.
for (int i = 0; i < adj.size(); i++) {
if (!visited.get(i)) {
dfs(i);
}
}
}
public static void main(String[] args) {
adj = new Vector<>();
visited = new Vector<>();
for (int i = 0; i < 8; i++) {
adj.add(new Vector<>());
}
adj.get(0).add(1);
adj.get(0).add(5);
adj.get(1).add(0);
adj.get(1).add(2);
adj.get(1).add(3);
adj.get(2).add(1);
adj.get(3).add(4);
adj.get(3).add(5);
adj.get(3).add(6);
adj.get(4).add(3);
adj.get(4).add(6);
adj.get(4).add(7);
adj.get(5).add(0);
adj.get(5).add(3);
adj.get(6).add(3);
adj.get(6).add(4);
adj.get(7).add(4);
dfsAll();
}
}
출력
1: 방문
2: 방문
3: 방문
4: 방문
5: 방문
7: 방문
8: 방문
6: 방문
'Algorithm > 알고리즘 (Java)' 카테고리의 다른 글
문자열 알고리즘 (1) | 2022.11.18 |
---|---|
[Java] BFS : 너비 우선 탐색 (0) | 2021.12.05 |
[Java] 트라이(Trie) 알고리즘 (0) | 2021.11.16 |
[Java] 프림 최소 스패닝 트리 (0) | 2021.11.15 |
[Java] 상호 배타적 집합 (0) | 2021.09.23 |