Depth First Search(๊น์ด์ฐ์ ํ์)์ผ๋ก, ๋ฃจํธ์์ ์์ํด์ ํด๋น ๋ถ๊ธฐ๋ฅผ ์ต๋ํ ๊น์ํ ํ์ ํ ๋ค์ ๋ถ๊ธฐ๋ก ๋์ด๊ฐ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
๋ฐฑํธ๋ํน*์ ์ฌ์ฉ๋๋ค.
์ฃผ๋ก, ์ฌ๊ทํธ์ถ, ์คํ์ผ๋ก ๊ตฌํํ๋ค.
*๋ฐฑํธ๋ํน : ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๋ชจ๋ ์กฐํฉ์ ์๋ฅผ ์ฐพ์๋ณด๋ ๊ฒ์ผ๋ก, ๊ฐ์ง์น๊ธฐ๋ฅผ ํตํด ๊ฐ๋ ๋์ง ์์ ๋ฃจํธ๋ ๊ณ ๋ คํ์ง ์๊ณ ํ์ํ๋ ๊ธฐ๋ฒ
Q. 0,1,2,3,4๊ฐ ์ด๋ ๊ฒ ์ฐ๊ฒฐ๋์ด ์๋ค๋ฉด DFS์ ๋ฐ๋ฅธ ๋ฐฉ๋ฌธ ์์๋ฅผ ๊ตฌํ๋ผ
(1) 0๊ณผ ์ฐ๊ฒฐ๋ 1,2,4 ์ค ์ ์ผ ์์ 1์ ๋ฐฉ๋ฌธํจ
โ [0, 1]
(2) 1๊ณผ ์ฐ๊ฒฐ๋ 0,2 ์ค ๋ฐฉ๋ฌธํ์ง ์์ 2๋ฅผ ๋ฐฉ๋ฌธํจ
โ [0,1,2]
(3) 2์ ์ฐ๊ฒฐ๋ 0,1,3 ์ค ๋ฐฉ๋ฌธํ์ง ์์ 3์ ๋ฐฉ๋ฌธํจ
โ [0,1,2,3]
(4) 3๊ณผ ์ฐ๊ฒฐ๋ 2,4 ์ค ๋ฐฉ๋ฌธํ์ง ์์ 4๋ฅผ ๋ฐฉ๋ฌธํจ
โ [0,1,2,3,4]
(5) 3์ผ๋ก backtracking, 2๋ก backtracking ...
์ฌ๊ท+์ธ์ ํ๋ ฌ
boolean[] visited = new boolean[100];
int[][] graph = new int[100][100];
//graph[x][y] == 1 ์ด๋ฉด, x์ y๊ฐ ์ฐ๊ฒฐ๋์ด ์์
void DFS(int v) {
visited[v] = true;
System.out.print(v+" ");
for(int i=1; i<graph[v].length; i++) {
if(graph[v][i] == 1 && !visited[i])
dfs(i);
}
}
์ฌ๊ท+์ธ์ ๋ฆฌ์คํธ
LinkedList<Integer>[] adjList = new LinkedList[100];
// ์ด๋ฏธ ๋ชจ๋ ์ฐ๊ฒฐ๋ ์ํ๋ผ๊ณ ๊ฐ์
boolean[] visited = new boolean[100];
void DFS(int v) {
visited[v] = true;
System.out.print(v+" ");
Iterator<Integer> iter = adjList[v].listIterator();
while(iter.hasNext()){
int w = iter.next();
if(!visited[w])
dfs(w);
}
}
์คํ
boolean[] visited = new boolean[100];
int[][] graph = new int[100][100];
//graph[x][y] == 1 ์ด๋ฉด, x์ y๊ฐ ์ฐ๊ฒฐ๋์ด ์์
void DFS(int start){
Stack<Integer> stack = new Stack<Integer>();
stack.push(start);
while(!stack.isEmpty()){
int v = stack.pop();
if(!visited[v]){
visited[v] = true;
System.out.println(v+" ");
for(int i=0; i<graph[v].length; i++){
if(!visited[i])
stack.push(i);
}
}
}
}
์ธ์ ๋ฆฌ์คํธ : O(V+E)
์ธ์ ํ๋ ฌ : O()
- ๋จ์ ๊ฒ์ ์๋๋ BFS ๋ณด๋ค ๋๋ฆผ
- ์ ๋ต์ ๊ตฌํ๋ฉด ํ์์ด ์ข ๋ฃ๋๋ฏ๋ก, ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๋ณด์ฅํ์ง ์์
- ํ์ฌ ๋ถ๊ธฐ์ ๋ ธ๋๋ง ๊ธฐ์ตํ๋ฉด ๋๋ฏ๋ก, ์ ์ฅ ๊ณต๊ฐ์ด ๋น๊ต์ ์ ์
- ๊ตฌํ์ด BFS๋ณด๋ค ๊ฐ๋จํจ