written by sohyeon, hyemin π‘
λλΉ μ°μ νμ(Breadth First Search)
μ μμ λ
Έλλ‘λΆν° κ°κΉμ΄ λ
Έλλ₯Ό λ¨Όμ λ°©λ¬Ένκ³ λ©λ¦¬ λ¨μ΄μ Έ μλ λ
Έλλ₯Ό λμ€μ λ°©λ¬Ένλ μν λ°©λ²μ΄λ€.
μλ₯Ό λ€μ΄, a λ Έλμμ μμνλ€κ³ νμ λ, BFSλ a λ Έλμ μ΄μ λ Έλλ₯Ό λͺ¨λ λ°©λ¬Έν λ€μμ μ΄μμ μ΄μλ€μ λ°©λ¬Ένλ€.
-
BFSλ DFSμ λ¬λ¦¬ μ¬κ·μ μΌλ‘ λμνμ§ μλλ€.
-
BFSλ λ°©λ¬Έν λ Έλλ₯Ό μ°¨λ‘λ‘ μ μ₯ν ν κΊΌλΌ μ μλ ν(queue)λ₯Ό μ¬μ©νλ€.
1. λ¨Όμ μμ λ
ΈλμΈ 0μ λ°©λ¬Έν λ€μ, νμ μ½μ
νλ€.
2. λ
Έλ 0μ μΈμ λ
ΈλμΈ {1,2,4}λ₯Ό μ°¨λ‘λλ‘ λ°©λ¬Έν λ€μ, νμ μ½μ
νλ€.
3. νμ μ½μ
λ {1,2,4} μμΌλ‘ νμμ μμ νλ©΄μ μΈμ ν λ
Έλμ λ°©λ¬Έ κ°λ₯νμ§ νμΈνλ€.
4. {1}μ μΈμ ν λ
Έλ {0,2}λ μ΄λ―Έ λ°©λ¬ΈνμΌλ―λ‘ νμμ μμ νλ€.
5. {2}μ μΈμ ν λ
Έλ {1,0,3,4}μμ λ°©λ¬Ένμ§ μλ {3}μ λ°©λ¬Έν ν νμμ μμ νλ€.
6. μμ μμμ λ§μ°¬κ°μ§λ‘ λͺ¨λ λ
Έλλ₯Ό λ°©λ¬Ένκ³ , νμμ μ’
λ£νλ€.
ꡬν λ°©λ²μΌλ‘λ μλ£ κ΅¬μ‘° ν(queue)λ₯Ό μ΄μ©νλ κ²
μ΄λ€.
void search(Node root) {
Queue queue = new Queue();
root.marked = true;
queue.enqueue(root); // λ£¨νΈ λ
Έλλ₯Ό νμ λμ μΆκ°νλ€.
// νκ° λΉμ΄ μμ λκΉμ§ κ³μνλ€.
while (!queue.isEmpty()) {
Node r = queue.dequeue(); // νμ μμμ μμ νλ€.
visit(r); // νμμ μμ ν λ
Έλλ₯Ό λ°©λ¬Ένλ€.
// νμμ μμ ν λ
Έλμ μΈμ ν λ
Έλλ€μ λͺ¨λ μ°¨λ‘λ‘ λ°©λ¬Ένλ€.
foreach (Node n in r.adjacent) {
if (n.marked == false) {
n.marked = true;
queue.enqueue(n); // νμ λμ μΆκ°νλ€.
}
}
}
}
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);
}
// sλ₯Ό μμ λ
Έλλ‘ BFSλ₯Ό νμνλ€.
void BFS(int s) {
// λ
Έλμ λ°©λ¬Έ μ¬λΆλ₯Ό νλ¨νλ€.
boolean visited[] = new boolean[V];
// BFS ꡬνμ μν ν(queue)λ₯Ό μμ±νλ€.
LinkedList<Integer> queue = new LinkedList<Integer>();
// νμ¬ λ
Έλλ₯Ό λ°©λ¬Έν κ²μΌλ‘ νμνκ³ νμ μ½μ
(add)νλ€.
visited[s]=true;
queue.add(s);
// νκ° λΉμ΄ μμ λκΉμ§ λ°λ³΅νλ€.
while (queue.size() != 0) {
// νμμ λ°©λ¬Έν λ
Έλλ₯Ό μμ (poll)νκ³ κ°μ μΆλ ₯νλ€.
s = queue.poll();
System.out.print(s+" ");
// λ°©λ¬Έν λ
Έλμ μΈμ ν λͺ¨λ λ
Έλλ₯Ό κ°μ Έμ¨λ€.
Iterator<Integer> i = adj[s].listIterator();
while (i.hasNext()) {
int n = i.next();
// λ°©λ¬Ένμ§ μμ λ
Έλκ° μλ€λ©΄ λ°©λ¬Έν κ²μΌλ‘ νμνκ³ νμ μ½μ
(add)νλ€.
if (!visited[n]) {
visited[n] = true;
queue.add(n);
}
}
}
}
// 2λ₯Ό μμ λ
Έλλ‘ νμ¬ BFSλ₯Ό νμνλ€.
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.BFS(2);
}
}
-
μ½λ©μΈν°λ·° μμ λΆμ
-
CμΈμ΄λ‘ μ½κ² νμ΄μ΄ μλ£ κ΅¬μ‘°
-
https://www.geeksforgeeks.org/breadth-first-search-or-bfs-for-a-graph/