본문 바로가기
알고리즘

[JAVA] 깊이 우선 탐색 (DFS)

by PEKAH 2021. 12. 12.

깊이 우선 탐색은 한 그래프의 정점들을 유용한 순서로 방문하는 한 방법이다

주어진 그래프의 한 정점에서 탐색을 시작하여 그 정점을 방문했다고 표시하고,

그 정점에 인접한 정점들 중 방문 안한 정점을 임의로 선택하여 방문한다

선택된 정점에 대해 같은 탐색과정을 반복한다.

더 이상 방문하지않은 인접한 정점이 없으면 바로 전에 방문했던 정점으로 돌아간다.

탐색을 반복하다가 시작 정점으로 돌아간 후 그 시작 정점에 인접한 정점들 중 방문하지 않은 정점이 없으면 종료한다.

 

시간복잡도

- 인접 행렬: O(V^2)

- 인접 리스트: O(V+E)

 

알고리즘

알고리즘 DFSearch(G)

1 V에 있는 각 정점을 '방문 안함'으로 표시한다.
2 각 정점 v에 대해 v가 '방문 안함'으로 표시되어 있다면 DFS(v)를 호출한다

DFS(v)
1 v의 데이터를 출력한다
2 v를 '방문함'으로 표시한다.
3 v에 인접한 모든 정점 w에 대해 w가 '방문 안함'으로 표시되어 있다면 DFS(w)를 호출한다

 

JAVA

import java.util.ArrayList;
import java.util.List;

class Node {
	int info;
	boolean visited;
	List<Node> neighbors;
	
	public Node(int info) {
		this.info = info;
		this.visited = false;
		this.neighbors = new ArrayList<>();
	}
	
	public void addNeighbors(Node neighborsNode) {
		this.neighbors.add(neighborsNode);
	}
	
	public List<Node> getNeighbors() {
		return neighbors;
	}
	
	public void setNeighbors(List<Node> neighbors) {
		this.neighbors = neighbors;
	}
	
	public String toString() {
		return "" + info;
	}
}

public class DepthFirstSearch {
	public static void DFS(Node v) {
		System.out.print(v.info + " ");
		
		v.visited = true;
		
		List<Node> neighbors = v.getNeighbors();
		
		for (int i = 0; i < neighbors.size(); i++) {
			Node w = neighbors.get(i);
			if (w != null && !w.visited)
				DFS(w);
		}
	}
	
	public static void main(String[] args) {
		Node[] node = new Node[6];
		
		for (int i = 0; i < 6; i++) {
			node[i] = new Node(i + 1);
		}
		
		node[0].addNeighbors(node[1]);
		node[0].addNeighbors(node[2]);
		node[0].addNeighbors(node[4]);
		node[1].addNeighbors(node[0]);
		node[1].addNeighbors(node[2]);
		node[2].addNeighbors(node[0]);
		node[2].addNeighbors(node[1]);
		node[2].addNeighbors(node[3]);
		node[2].addNeighbors(node[4]);
		node[3].addNeighbors(node[2]);
		node[3].addNeighbors(node[5]);
		node[4].addNeighbors(node[0]);
		node[4].addNeighbors(node[2]);
		node[5].addNeighbors(node[2]);
		node[5].addNeighbors(node[3]);

		System.out.println("재귀를 사용한 깊이 우선 탐색 실행 결과");
		DFS(node[0]);
	}
}

 

 

 

 

 

 

'알고리즘' 카테고리의 다른 글

[JAVA] 너비 우선 탐색 (BFS)  (0) 2021.12.14
[JAVA] 힙 정렬 (Heap Sort)  (0) 2021.12.07
[JAVA] 삽입 정렬(Insertion Sort)  (0) 2021.12.07
[JAVA] 선택 정렬(Selection Sort)  (0) 2021.12.06
[JAVA] 이진 탐색 (Binary Search)  (0) 2021.12.06

댓글