๐ ์ ์
01. DFS(Depth First Search) : ๊น์ด ์ฐ์ ํ์)
๋ฃจํธ ๋ ธํธ์์ ์์ํด์ ๋ค์ ๋ถ๊ธฐ๋ก ๋์ด๊ฐ๊ธฐ ์ ์ ํด๋น ๋ถ๊ธฐ๋ฅผ ์๋ฒฝํ๊ฒ ํ์ํ๋ ๋ฐฉ๋ฒ.
๋ชจ๋ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ๊ณ ์ ํ๋ ๊ฒฝ์ฐ์ ์ฌ์ฉํ๋ค.
์คํ(Stack) / ์ฌ๊ทํจ์ ์ฌ์ฉ, ๋ ธ๋ ๋ฐฉ๋ฌธ ์ฌ๋ถ(isVisited[idx]) ์ฌ์ฉ
์ฅ์
- ๋จ์ง ํ ๊ฒฝ๋ก์์ ๋ ธ๋๋ง์ ๊ธฐ์ตํ๋ฉด ๋๋ฏ๋ก ์ ์ฅ๊ณต๊ฐ์ ์์๊ฐ ๋น๊ต์ ์ ๋ค.
- ๋ชฉํ๋ ธ๋๊ฐ ๊น์ ๋จ๊ณ์ ์์ ๊ฒฝ์ฐ ํด๋ฅผ ๋นจ๋ฆฌ ๊ตฌํ ์ ์๋ค.
๋จ์
- ํด๊ฐ ์๋ ๊ฒฝ๋ก์ ๊น์ด ๋น ์ง ๊ฐ๋ฅ์ฑ์ด ์๋ค. ๋ฐ๋ผ์ ์ค์ ์ ๊ฒฝ์ฐ ๋ฏธ๋ฆฌ ์ง์ ํ ์์์ ๊น์ด๊น์ง๋ง ํ์ํ๊ณ ๋ชฉํ๋ ธ๋๋ฅผ ๋ฐ๊ฒฌํ์ง ๋ชปํ๋ฉด ๋ค์ ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ผ ํ์ํ๋ ๋ฐฉ๋ฒ์ด ์ ์ฉํ ์๋ ์๋ค.
-> ํ์ ๊ณผ์ ์ด ๋๋ฌด ๊น๊ฒ ์งํ๋๋ ๊ฒ์ ๋ง๊ธฐ ์ํด ๊น์ด ์ ํ์ ์ฌ์ฉํ๋ค.
- ์ป์ด์ง ํด๊ฐ ์ต๋จ ๊ฒฝ๋ก๊ฐ ๋๋ค๋ ๋ณด์ฅ์ด ์๋ค. ์ด๋ ๋ชฉํ์ ์ด๋ฅด๋ ๊ฒฝ๋ก๊ฐ ๋ค์์ธ ๋ฌธ์ ์ ๋ํด DFS๋ ํด์ ๋ค๋ค๋ฅด๋ฉด ํ์์ ๋๋ด๋ฒ๋ฆฌ๋ฏ๋ก, ์ด๋ ์ป์ด์ง ํด๋ ์ต์ ์ด ์๋ ์๋ ์๋ค.
BFS(Breadth First Search) : ๋๋น ์ฐ์ ํ์
๋ฃจํธ ๋
ธ๋์์ ์์ํด์ ์ธ์ ํ ๋
ธ๋๋ฅผ ๋จผ์ ํ์ํ๋ ๋ฐฉ๋ฒ
๋ ๋
ธ๋ ์ฌ์ด์ ์ต๋จ ๊ฒฝ๋ก or ์์์ ๊ฒฝ๋ก๋ฅผ ์ฐพ์ ๋ ์ฌ์ฉํ๋ค.
ํ(Queue), ๋
ธ๋ ๋ฐฉ๋ฌธ ์ฌ๋ถ(isVisited[idx]) ์ด์ฉ
์ฅ์
- ์ถ๋ฐ๋ ธ๋์์ ๋ชฉํ๋ ธ๋๊น์ง์ ์ต๋จ ๊ธธ์ด ๊ฒฝ๋ก๋ฅผ ๋ณด์ฅ
๋จ์
- ๊ฒฝ๋ก๊ฐ ๋งค์ฐ ๊ธธ ๊ฒฝ์ฐ์๋ ํ์ ๊ฐ์ง๊ฐ ๊ธ๊ฒฉํ ์ฆ๊ฐํจ์ ๋ฐ๋ผ ๋ณด๋ค ๋ง์ ๊ธฐ์ต ๊ณต๊ฐ์ ํ์
- ํด๊ฐ ์กด์ฌํ์ง ์๋๋ค๋ฉด ์ ํ ๊ทธ๋ํ์ ๊ฒฝ์ฐ, ๋ชจ๋ ๊ทธ๋ํ๋ฅผ ํ์ํ ํ์ ์คํจ๋ก ๋๋๋ค.
- ๋ฌดํ ๊ทธ๋ํ์ ๊ฒฝ์ฐ์๋ ๊ฒฐ์ฝ ํด๋ฅผ ์ฐพ์ง๋ ๋ชปํ๊ณ , ๋๋ด์ง๋ ๋ชปํ๋ค.
๐ป ๊ตฌํ ๋ฐฉ๋ฒ
01. DFS
์คํ
1. ํ์ ์์ ๋ ธ๋๋ฅผ ์คํ์ ์ฝ์ ํ๊ณ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ
2. ์คํ์ ์ต์๋จ ๋ ธ๋์ ๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ํ ๋ ธ๋๊ฐ ํ๋๋ผ๋ ์์ผ๋ฉด ๊ทธ ๋ ธ๋๋ฅผ ์คํ์ ๋ฃ๊ณ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ
๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋ ธ๋๊ฐ ์์ผ๋ฉด ์คํ์์ ์ต์๋จ ๋ ธ๋๋ฅผ ๊บผ๋ธ๋ค.
3. 2๋ฒ์ ๊ณผ์ ์ ์ํํ ์ ์์ ๋๊น์ง ๋ฐ๋ณต
#include <iostream>
#include <stack>
#include <vector>
#include <algorithm> // sort
using namespace std;
// stack์ ๋ค์ด๊ฐ๋ฉด ๋ฐฉ๋ฌธํ ๊ฒ์ผ๋ก ํ๋จ
// ํด๋น ์์น๋ฅผ true๋ก ํด์ค๋ค.
void dfs(int start, vector<int> graph[], bool check[]){
stack<int> s;
s.push(start);
check[start] = true;
cout << start << " ";
while(!s.empty()){
int current_node = s.top();
s.pop();
for(int i=0; i<graph[current_node].size(); i++){
int next_node = graph[current_node][i];
if(check[next_node]==false){
cout << next_node << " ";
check[next_node] = true;
// pop()์ ํ์๊ธฐ ๋๋ฌธ์ ํ์ฌ current_node๋ ๋ฃ์ด์ค์ผํ๋ค.
s.push(current_node);
s.push(next_node);
break;
}
}
}
}
์ฌ๊ท
#include <iostream>
#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;
// dfs์ ๋ค์ด์ค๋ฉด '๋ฐฉ๋ฌธ'ํ๊ฑฐ๋ก ํ๋จ
// ํด๋น ์์น์ check true๋ก ํด์ค๋ค.
void dfs(int start, vector<int> graph[], bool check[]){
check[start]= true;
cout << start << " ";
for(int i=0; i < graph[start].size(); i++){
int next = graph[start][i];
// ๋ฐฉ๋ฌธํ์ง ์์๋ค๋ฉด
if(check[next]==false){
// ์ฌ๊ทํจ์๋ฅผ ํธ์ถํ๋ค.
dfs(next, graph, check);
}
}
}
02. BFS
1. ํ์ ์์ ๋ ธ๋๋ฅผ ํ์ ์ฝ์ ํ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
2. ํ์์ ๋ ธ๋๋ฅผ ๊บผ๋ธ ๋ค์ ํด๋น ๋ ธ๋์ ์ธ์ ๋ ธ๋ ์ค ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋๋ฅผ ๋ชจ๋ ํ์ ์ฝ์ ํ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
3. 2๋ฒ ๋ฐ๋ณต
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
void bfs(int start, vector<int> graph[], bool check[]){
queue<int> q;
q.push(start);
check[start] = true;
while(!q.empty()){
int tmp = q.front();
q.pop();
cout << tmp << " ";
for(int i=0; i<graph[tmp].size(); i++){
// ๋ฐฉ๋ฌธํ์ง ์์๋ค๋ฉด
if(check[graph[tmp][i]] == false){
// ํ์ ๋ฃ์ด์ฃผ๊ณ ๋ฐฉ๋ฌธํ์์ ํ์ํ๋ค.
q.push(graph[tmp][i]);
check[graph[tmp][i]] = true;
}
}
}
}
Main ํจ์
int main (){
int n, m, start;
cin >> n >> m >> start;
// vscode ๋ณ์๋ฅผ ํตํด์ ๋ฐฐ์ด์ ๋์ ์ผ๋ก ์์ฑํ ๋
// vector<int> * graph = new vector<int>[n+1];
vector<int> graph[n+1];
bool check [n+1];
fill(check, check+n+1, false);
for(int i=0; i<m; i++){
int u,v;
cin >> u >> v;
graph[u].push_back(v);
graph[v].push_back(u);
}
// Sorting
// ๋์ค์ ํ๋์ ์ ์ ์์ ๋ค์์ ํ์ํ ๋ node ๊ฐ์ ์์ฐจ์ ์ผ๋ก ์ ๊ทผํด์ผํ๊ธฐ ๋๋ฌธ
for(int i=1; i<=n; i++){
sort(graph[i].begin(), graph[i].end());
}
dfs(start, graph, check);
cout << "\n";
return 0;
}
์ถ์ฒ:
https://sweetday-alice.tistory.com/176
https://twpower.github.io/73-how-to-implement-dfs-and-bfs-in-cpp
https://better-tomorrow.tistory.com/entry/DFS-BFS-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0
'โจ Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค/C++] 10872๋ฒ : ํฉํ ๋ฆฌ์ผ (0) | 2021.08.24 |
---|---|
[๋ฐฑ์ค/C++] 1260๋ฒ : DFS์ BFS (0) | 2021.08.24 |
[ํ๋ก๊ทธ๋๋จธ์ค/C++] ํ๊ฒ ๋๋ฒ(DFS) (0) | 2021.08.24 |
[ํ๋ก๊ทธ๋๋จธ์ค/C++] ์ฒด์ก๋ณต(Greedy) (0) | 2021.08.24 |
[๋ฐฑ์ค/C++] 11399๋ฒ : ATM (0) | 2021.08.16 |
๋๊ธ