알고리즘) DFS [깊이 우선 탐색] 간단정리

 

  • 정의

    • 하나의 정점으로부터 시작, 차례대로 모든 정점을 번씩 방문.
    • 다음 분기로 넘어가기 전에 해당 분기를 완벽히 탐색한다.
    • 맹목적 탐색 방법, 모든 노드를 방문

  • 특징

    • 자기자신을 호출하는 순환 알고리즘 형태
    • 번씩만 방문하는것이기 때문에 방문한 노드인지 검사하는 과정 필요
    • 탐색과정에서 깊이제한, 부모노드로 다시 돌아오는 백트래킹.

  • 구현

    • 인접행렬 혹은 인접 리스트로 구현가능.
    • 재귀 호출 혹은 스택을 이용하여 구현.

 

  • 인접 리스트를 이용하여 코드 구현

public class Dfs {
	private int V;
	private LinkedList<Integer> adj[];
	
	public Dfs(int v) {
		this.V = v+1;
		adj = new LinkedList[V];
		
		for(int i = 1 ; i <= v; i++ ) {
			adj[i] = new LinkedList();
		}
	}
	
	public void addEdge(int v, int w) {
		adj[v].add(w);
		adj[w].add(v);
	}
	
	public void DfsR(int v, boolean visited[]) {
		visited[v] = true;
		System.out.println(v+" ");
		
		Iterator<Integer> iter = adj[v].iterator();
		while(iter.hasNext()) {
			int n = iter.next();
			if(!visited[n]) {
				visited[n] = true;
				DfsR(n, visited);
			}
		}
	}
	
	public void DFS(int v) {
		boolean[] visited = new boolean [V];
		
		DfsR(v, visited);
	}
}

댓글

가장 많이 본 글