[Algorithm&μλ£κ΅¬μ‘°] BFS/DFS?
β BFS/DFS νμμ λͺ©μ
: μμμ Xμμ μμν΄μ λͺ¨λ μ μ μ ν λ²μ© λ°©λ¬Ένλ κ².
1. DFS(κΉμ΄ μ°μ νμ) Stack(νμ μ μΆ) κ³Ό μ¬κ·ν¨μ μ¬μ©
: ν μμμ μμ κ° μ μμ λκΉμ§ κ³μν΄μ μ§ν. λ μ΄μ μ§νν μ μμ λ μ΄μ μΌλ‘ λμμμ λ€μ κ° μ μμ λκΉμ§ μ§ν
: λ°©λ¬Ένλ μ§, μνλ μ§λ₯Ό 체ν¬ν visited[] λ°°μ΄ μ¬μ©
i | 1 | 2 | 3 | 4 | 5 | 6 |
visited[i] | 0 | 0 | 0 | 0 | 0 | 0 |
1) 1 λ°©λ¬Έ
stack 1
visited[1] = 1 λμ
2) 1κ³Ό μ°κ²°λ 2, 5 μ€μ μμ κ°μΈ 2 λ°©λ¬Έ(μ μ κ°μ΄ μμ κ³³μΌλ‘ μ΄λ)
stack 1 2
visited[2] = 1
3) 2μ μ°κ²°λ 3, 5 μ€μ 3 λ°©λ¬Έ
stack 1 2 3
visited[3] = 1
3) 3κ³Ό μ°κ²°λ 4 λ°©λ¬Έ
stack 1 2 3 4
visited[4] = 1
4) 4μ μ°κ²°λ 5, 6 μ€μ 5 λ°©λ¬Έ
stack 1 2 3 4 5
visited[5] = 1
5) 5μμ λμ΄μ κ° μ μλ κ³³μ΄ μμΌλ―λ‘ stackμ λ§μ§λ§(λ°λ‘ μ μ μ μ ) κ°(4)μΌλ‘ λμκ°κΈ°.
stack 1 2 3 4
6) 4μμ λ€μ νμμ μμνμ¬ 6 λ°©λ¬Έ
stack 1 2 3 4 6
visited[6] = 1
7) 2μμ λμ΄μ κ° μ μλ κ³³(visited[i] = 0 μΈ κ³³)μ΄ μμΌλ―λ‘ stackμμ νλμ© κΊΌλ΄μ 1λ‘ λμμ€κΈ°
stack
1) DFSλ₯Ό μΈμ νλ ¬λ‘ κ΅¬ννλ λ°©λ² -> μκ°λ³΅μ‘λ O(V^2)
void dfs(int x){
visited[x] = true;
cout << x;
for(int i = 1; i<=n; i++){
if(a[x][i] == 1 && visited[i] == false){
dfs(i);
}
}
}
; λͺ¨λ μ μ μ νμ
2) DFSλ₯Ό μΈμ 리μ€νΈλ‘ ꡬννλ λ°©λ² -> μκ° λ³΅μ‘λ O(V+E)
void dfs(int x){
visited[x] = true;
cout << x;
for(int i = 0; i<a[x].size(); i++){
int y = a[x][i];
if(visited[y] == false){
dfs(y);
}
}
}
}
; μΈμ νλ ¬κ³Ό λ€λ₯Έ μ μ a[x]μ μ μ₯λ μ°κ²°λ λ€μ κ°μ λ§μ μ°Ύμμ νμν μ μμ.
2. BFS(λλΉ μ°μ νμ) queue(μ μ μ μΆ) μ΄μ©
: ν μμμ μμ κ° μ μλ κ²½μ°λ₯Ό λͺ¨λ νμνλ©΄μ μ§ν.
: νλ₯Ό μ΄μ©ν΄μ μ§κΈ μμΉμμ κ° μ μλ κ²μ λͺ¨λ νμ λ£λ λ°©μ.
: νμ λ£μ λ λ°©λ¬Ένλ€κ³ 체ν¬ν΄μΌ νλ€. visited[] λ°°μ΄ μ¬μ©
i | 1 | 2 | 3 | 4 | 5 | 6 |
visited[i] | 0 | 0 | 0 | 0 | 0 | 0 |
1) queue 1 λ£κ³ visited 체ν¬
visited[1] = 1
2) queue.pop() ν΄μ queueμ 첫λ²μ§Έ κ°μΈ 1λΆν° νμ μμ
queue
2) 1κ³Ό μ°κ²°λ 2, 5 νμ μ μ₯νκ³ visited 체ν¬
queue 2 5
visited[2] = 1, visited[5] = 1
2) queue.pop() ν΄μ queueμ 맨 μ κ°μΈ 2 λΆν° νμ μμ
queue 5
3) 2μ μ°κ²°λ 3 queueμ μ μ₯νκ³ visited 체ν¬
queue 5 3
visited[3] = 1
4) queue.pop()ν΄μ queueμ 맨 μ κ°μΈ 5 λΆν° νμ μμ
queue 3
5) 5μ μ°κ²°λ 4 queueμ μ μ₯νκ³ visited 체ν¬
queue 3 4
visited[4] = 1
6) queue.pop()ν΄μ queueμ 맨 μ κ°μΈ 3 λΆν° νμ μμ
queue 4
7) 3κ³Ό μ°κ²°λ μ μ μ€μ νμν μ μλ μ μ μ΄ μμΌλ―λ‘ λ€μ queue.pop() ν΄μ 4μμ νμ μμ
queue
8) 4μ μ°κ²°λ 6 queueμ μ μ₯νκ³ visited 체ν¬
queue 6
visited[6] = 1
9) queue.pop()ν΄μ queueμ 맨 μ κ°μΈ 6 μμ νμ μμ
queue
10) 6κ³Ό μ°κ²°λ μ μ μ€μ λ°©λ¬Έν μ μ μκ³ , queue κ° λΉμμΌλ―λ‘ νμ μ’ λ£.
1) BFSλ₯Ό μΈμ νλ ¬λ‘ κ΅¬ννλ λ°©λ² -> μκ°λ³΅μ‘λ O(V^2)
queue<int> q;
visited[1] = true;
q.push(1);
while(!q.empty()){
int x = q.front();
q.pop();
cout << x;
for(int i = 1; i<=n; i=+){
if(a[x][i] == 1 && visited[i] == false){
visited[i] = true;
q.push(i);
}
}
}
2) BFSλ₯Ό μΈμ νλ ¬λ‘ κ΅¬ννλ λ°©λ² -> μκ° λ³΅μ‘λ O(V+E)
queue<int> q;
visited[1] = true;
q.push(1);
while(!q.empty()){
int x = q.front();
q.pop();
cout << x;
for(int i = 1; i<a[x].size(); i=+){
int y = a[x][i];
if(visited[y] == false){
visited[y] = true;
q.push(y);
}
}
}
<μ°Έκ³ λ¬Έμ >
1260λ²: DFSμ BFS
첫째 μ€μ μ μ μ κ°μ N(1 ≤ N ≤ 1,000), κ°μ μ κ°μ M(1 ≤ M ≤ 10,000), νμμ μμν μ μ μ λ²νΈ Vκ° μ£Όμ΄μ§λ€. λ€μ Mκ°μ μ€μλ κ°μ μ΄ μ°κ²°νλ λ μ μ μ λ²νΈκ° μ£Όμ΄μ§λ€. μ΄λ€ λ μ μ μ¬
www.acmicpc.net