written by sohyeon, hyemin π‘
κΉμ΄ μ°μ νμ(Depth First Search)
μ λ£¨νΈ λ
Έλ(νΉμ λ€λ₯Έ μμμ λ
Έλ)μμ μμν΄μ λ€μ λΆκΈ°(branch)λ‘ λμ΄κ°κΈ° μ μ ν΄λΉ λΆκΈ°λ₯Ό μλ²½νκ² νμνλ λ°©λ²μ΄λ€.
-
λ―Έλ‘λ₯Ό νμν λ ν λ°©ν₯μΌλ‘ κ° μ μμ λκΉμ§ κ³μ κ°λ€κ° λ μ΄μ κ° μ μκ² λλ©΄ λ€μ κ°κΉμ΄ κ°λ¦ΌκΈΈλ‘ λμμμ μ΄κ³³μΌλ‘λΆν° λ€λ₯Έ λ°©ν₯μΌλ‘ λ€μ νμμ μ§ννλ λ°©λ²κ³Ό μ μ¬νλ€.
-
κ·Έλνμμ λͺ¨λ λ Έλλ₯Ό λ°©λ¬Ένκ³ μ ν λ λ μ νΈλλ νΈμ΄λ€.
-
μ μ μνλ₯Ό ν¬ν¨ν λ€λ₯Έ ννμ νΈλ¦¬ μνλ λͺ¨λ κΉμ΄ μ°μ νμ(DFS)μ ν μ’ λ₯μ΄λ€.
-
κ·Έλν νμμ κ²½μ°
μ΄λ€ λ Έλλ₯Ό λ°©λ¬Ένμλμ§ μ¬λΆλ₯Ό λ°λμ κ²μ¬
ν΄μΌ νλ€λ κ²μ΄λ€.- κ²μ¬νμ§ μμ κ²½μ° λ¬΄ν루νμ λΉ μ§ μνμ΄ μλ€.
-
κΉμ΄ μ°μ νμμ μκΈ° μμ μ λ€μ νΈμΆνλ
μν μκ³ λ¦¬μ¦
μ ννλ₯Ό κ°μ§κ³ μλ€.
1. κ·Έλνμ μμ λ
Έλμμ μΆλ°νμ¬ λ¨Όμ μμ λ
Έλ vλ₯Ό λ°©λ¬Ένκ³ λ°©λ¬Ένμλ€κ³ νμνλ€.
2. vμ μΈμ ν λ
Έλλ€ μ€μμ μμ§ λ°©λ¬Ένμ§ μμ λ
Έλ uλ₯Ό μ ννλ€.
3. λ§μ½ κ·Έλ¬ν λ
Έλκ° μλ€λ©΄ νμμ μ’
λ£νλ€.
4. λ§μ½ μμ§ λ°©λ¬Ένμ§ μμ λ
Έλ uκ° μλ€λ©΄ uλ₯Ό μμ λ
Έλλ‘ νμ¬ κΉμ΄ μ°μ νμμ λ€μ μμνλ€.
5. μ΄ νμμ΄ λλκ² λλ©΄ λ€μ vμ μΈμ ν λ
Έλλ€ μ€μμ μμ§ λ°©λ¬Έμ΄ μ λ λ
Έλλ₯Ό μ°Ύλλ€.
6. μμ κ²½μ° μ’
λ£νκ³ , μλ€λ©΄ λ€μ κ·Έ λ
Έλλ₯Ό μμ λ
Έλλ‘ νμ¬ κΉμ΄ μ°μ νμμ λ€μ μμνλ€.
-
0λ² λ Έλλ₯Ό μμ λ Έλλ‘ μ ννκ³ μ΄λ―Έ λ°©λ¬Έν λ Έλλ μ£Όν©μμΌλ‘ νμνμλ€.
-
μ μ νμ΄νλ μ΄λ―Έ λ°©λ¬Έν λ Έλλ‘μ λ°©λ¬Έμ μλνλ€κ° μ€ν¨ν κ°μ μ μλ―Ένκ³ , μ€μ νμ΄νλ μ€μ λ‘ λ°©λ¬Ένλ κ°μ μ μλ―Ένλ€.
ꡬν λ°©λ²μλ μν νΈμΆμ μ΄μ©νλ κ²
κ³Ό λͺ
μμ μΈ μ€νμ μ¬μ©νλ κ²(λ°©λ¬Έν λ
Έλλ€μ μ€νμ μ μ₯νμλ€κ° λ€μ κΊΌλ΄μ΄ μμ
νλ κ²)
μ΄λ€.
void search(Node root) {
if (root == null) return;
// root λ
Έλλ₯Ό λ°©λ¬Ένλ€.
visit(root);
root.visited = true;
// root λ
Έλμ μΈμ ν μ μ μ λͺ¨λ λ°©λ¬Ένλ€.
for each (Node n in root.adjacent) {
// λ°©λ¬Ένμ§ μμ λ
Έλκ° μλ€λ©΄ root λ
Έλμ μΈμ ν μ μ μ μ μ μμ μ μ μΌλ‘ DFSλ₯Ό μμ
if (n.visited == false) {
search(n);
}
}
}
https://gmlwjd9405.github.io/2018/08/14/algorithm-dfs.html
import java.io.*;
import java.util.*;
// μΈμ 리μ€νΈλ₯Ό μ΄μ©ν λ°©ν₯μ± μλ κ·Έλν ν΄λμ€
class Graph {
private int V; // λ
Έλμ κ°μ
private LinkedList<Integer> adj[]; // μΈμ 리μ€νΈ
// Constructor(μμ±μ)
Graph(int v) {
V = v;
adj = new LinkedList[v];
for (int i=0; i<v; ++i)
adj[i] = new LinkedList();
}
// λ
Έλλ₯Ό μ°κ²°νλ€. (v->w)
void addEdge(int v, int w) {
adj[v].add(w); // Add w to v's list.
}
// DFSμ μν΄ μ¬μ©λλ ν¨μ
void DFSUtil(int v,boolean visited[]) {
// νμ¬ λ
Έλλ₯Ό λ°©λ¬Έν κ²μΌλ‘ νμνκ³ κ° μΆλ ₯νλ€.
visited[v] = true;
System.out.print(v+" ");
// λ°©λ¬Έν λ
Έλμ μΈμ ν λͺ¨λ λ
Έλλ₯Ό κ°μ Έμ¨λ€.
Iterator<Integer> i = adj[v].listIterator();
while (i.hasNext()) {
int n = i.next();
// λ°©λ¬Ένμ§ μμ λ
Έλλ©΄ ν΄λΉ λ
Έλλ₯Ό μμ λ
Έλλ‘ νκ³ DFSUtilμ νΈμΆνλ€.
if (!visited[n])
DFSUtil(n, visited);
}
}
// μ£Όμ΄μ§ λ
Έλλ₯Ό μμ λ
Έλλ‘ DFSλ₯Ό νμνλ€.
void DFS(int v) {
// λ
Έλμ λ°©λ¬Έ μ¬λΆλ₯Ό νλ¨νλ€.
boolean visited[] = new boolean[V];
// vλ₯Ό μμ λ
Έλλ‘ νμ¬ DFSUtilμ μν νΈμΆνλ€.
DFSUtil(v, visited);
}
// 2λ₯Ό μμ λ
Έλλ‘ νμ¬ DFSλ₯Ό νμνλ€.
public static void main(String args[]) {
Graph g = new Graph(4);
g.addEdge(0, 1);
g.addEdge(0, 2);
g.addEdge(1, 2);
g.addEdge(2, 0);
g.addEdge(2, 3);
g.addEdge(3, 3);
g.DFS(2);
}
}
-
μ½λ©μΈν°λ·° μμ λΆμ
-
CμΈμ΄λ‘ μ½κ² νμ΄μ΄ μλ£ κ΅¬μ‘°
-
https://www.geeksforgeeks.org/depth-first-search-or-dfs-for-a-graph/