- 하나의 정점으로부터 시작, 차례대로 모든 정점을 한 번씩 방문.
- 다음 분기로 넘어가기 전에 해당 분기를 완벽히 탐색한다.
- 맹목적 탐색의 방법, 모든 노드를 방문
- 자기자신을 호출하는 순환 알고리즘의 형태
- 한 번씩만 방문하는것이기 때문에 방문한 노드인지 검사하는 과정 필요
- 탐색과정에서 깊이제한, 부모노드로 다시 돌아오는 백트래킹.
- 인접행렬 혹은 인접 리스트로 구현가능.
- 재귀 호출 혹은 스택을 이용하여 구현.
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);
}
}
댓글
댓글 쓰기