โ 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);
}
}
}
<์ฐธ๊ณ ๋ฌธ์ >
'๐ Coding Test Study' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[C++][๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ] ๊ตฌํ ๋ฐฉ๋ฒ (0) | 2021.07.29 |
---|---|
C++ ๋ฌธ์์ด ๋ค๋ฃจ๊ธฐ (0) | 2021.05.20 |
DP(Dynamic Programming)? (0) | 2021.04.27 |
[์๋ฃ๊ตฌ์กฐ&์๊ณ ๋ฆฌ์ฆ] ๊ทธ๋ํ? (0) | 2021.04.13 |
[Algorithm] ๋ธ๋ฃจํธ ํฌ์ค(Brute Force) (0) | 2021.03.01 |