< BFS(Breath First Search): ๋๋น ์ฐ์ ํ์ >
Queue์ ๋ฐฉ๋ฌธ๋ ธ๋๋ฅผ ์ฒดํฌํ ๋ฐฐ์ด์ ์ด์ฉํ์ฌ ์ฝ๋ฉํ ์ ์์ต๋๋ค.
(Queue๋ ์ ์ ์ ์ถ ๊ตฌ์กฐ๋ฅผ ๊ฐ๋ ์๋ฃ๊ตฌ์กฐ๋ก, ๋จผ์ ๋ฃ์ ๊ฐ์ ๋จผ์ ์ฌ์ฉํฉ๋๋ค. ๋ฐ๋ผ์ ๋๊ฒ ํ์ํด์ผํ๋ BFS๋ก ์ ์ ํ ๋ฐฉ๋ฒ์ ๋๋ค)
1. queue์ 0๋ฒ ๋ ธ๋๋ฅผ ๋ฃ์ต๋๋ค.
int visit []
0 | 0 | 0 | 0 | 0 |
queue<int>
0
|
|
|
|
|
|
2. ํ๋ฒ ๋ฐฉ๋ฌธํ ๋ ธ๋๋ ๋ค์ ๋ฐฉ๋ฌธํ์ง ์๊ธฐ ์ํด visit ๋ฐฐ์ด์ ํ์ฌ๋ ธ๋๋ฅผ ์ฒดํฌํฉ๋๋ค.
int visit []
1
|
0
|
0
|
0
|
0
|
0
|
queue<int>
0
|
|
|
|
|
|
3. queue์ ์ฒซ๋ฒ์งธ ๊ฐ์ธ 0๋ฒ๋ ธ๋๋ฅผ ๋นผ์ ํ์ํฉ๋๋ค.
์ฆ, 0๋ฒ ๋ ธ๋์ ์ด์ ๋ ธ๋์ธ 1๋ฒ, 2๋ฒ ๋ ธ๋๊ฐ ๋ฐฉ๋ฌธ๋ ์ ์ด ์๋์ง๋ฅผ ํ์ธํ๊ณ
๋ฐฉ๋ฌธํ ์ ์ด ์์ผ๋ฉด queue์ ์ฝ์ ํ๊ณ ๋ฐฉ๋ฌธ๋ ธ๋๋ก ์ฒดํฌํฉ๋๋ค.
int visit []
1
|
1
|
1
|
0
|
0
|
0
|
queue<int>
1
|
2
|
|
|
|
|
4. queue์ ๋งจ ์ ๊ฐ์ธ 1๋ฒ ๋ ธ๋๋ฅผ ๋นผ์ ํ์ํฉ๋๋ค.
1๋ฒ ๋ ธ๋์ ์ด์๋ ธ๋(3, 4)๋ฅผ ๋ฐฉ๋ฌธํ ์ ์ด ์์ผ๋ฉด queue์ ์ฝ์ ํ๊ณ ๋ฐฉ๋ฌธ๋ ธ๋๋ก ์ฒดํฌํฉ๋๋ค.
int visit []
1
|
1
|
1
|
1
|
1
|
0
|
queue<int>
2
|
3
|
4
|
|
|
|
5. queue๊ฐ ๋น ๋๊น์ง ์์ ๊ณผ์ ์ ๋ฐ๋ณตํฉ๋๋ค.
[ C++ ์ฝ๋ ]
#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> v[1001];
int visit_bfs[1001] = { 0, };
void bfs(int s) {
queue<int> q;
q.push(s); //ํ์ ๋ฃ๊ณ
visit_bfs[s] = true; //๋ฐฉ๋ฌธ๋
ธ๋๋ก ์ฒดํฌ
while (!q.empty()) { //ํ๊ฐ ๋ชจ๋ ๋น์์ง ๋ ๊น์ง
int x = q.front(); //ํ์ ๋งจ ์ฒซ๋ฒ์งธ ๊ฐ์ ๋นผ์ ํ์ธ
q.pop(); //ํ์์ ์ ๊ฑฐ
cout << x << " ";
for (int i = 0; i < v[x].size(); i++) //ํ์ฌ๋
ธ๋์ ์ฐ๊ฒฐ๋ ๋
ธ๋์ ํฌ๊ธฐ๊น์ง
{
int y = v[x][i]; //์ธ์ ๋
ธ๋ ๊ฐ์ ์ ์ฅ
if (!visit_bfs[y]) { //์ธ์ ๋
ธ๋๊ฐ ๋ฐฉ๋ฌธ ์ํ ๋
ธ๋์ด๋ฉด
q.push(y); //ํ์ ์ฝ์
visit_bfs[y] = true; //๋ฐฉ๋ฌธ๋
ธ๋๋ก ์ฒดํฌ
}
}
}
}
int main() {
int V, E, S; //๋
ธ๋, ์ฃ์ง, ์์๋
ธ๋
cin >> V >> E >> S;
int v1, v2;
for(int i = 1; i <= E; i++) {
cin >> v1 >> v2; //์ฐ๊ฒฐ๋ ๋
ธ๋ ์ ๋ณด๋ฅผ ์
๋ ฅํ๋ฉด ๋ฒกํฐ๋ก ์ฐ๊ฒฐํ๊ธฐ
v[v1].push_back(v2);
v[v2].push_back(v1);
}
for (int i = 1; i < V; i++) { //์ค๋ฆ์ฐจ์ ์ ๋ ฌ
sort(v[i].begin(), v[i].end());
}
bfs(S);
}
< DFS(Depth First Search): ๊น์ด ์ฐ์ ํ์ >
Stack or ์ฌ๊ทํธ์ถ๊ณผ ๋ฐฉ๋ฌธ๋ ธ๋๋ฅผ ์ฒดํฌํ ๋ฐฐ์ด ์ด์ฉ
(๋ฐฉ๋ฌธํ ๋ ธ๋์ ์ด์๋ ธ๋๊ฐ ์์ ๋๊น์ง ๊น์ด ์๊ฒ ํ์ํด์ผ ํ๋ฏ๋ก ํ์ ์ ์ถ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง Stack or ์ฌ๊ทํธ์ถ์ ์ด์ฉํ๋ ๊ฒ์ ๋๋ค)
1. ์คํ์ 0๋ฒ ๋ ธ๋(์์๋ ธ๋)๋ฅผ ์ฝ์ ํ๊ณ , 0๋ฒ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธ๋ ธ๋๋ก ์ฒดํฌํฉ๋๋ค.
int visit []
1
|
0
|
0
|
0
|
0
|
0
|
stack <int>
0
|
|
|
|
|
|
2. 0๋ฒ ๋ ธ๋์ ์ด์๋ ธ๋ 1, 2๊ฐ ์์ผ๋ฏ๋ก ์ฐ์ ์์์ ์ํด stack์ 1๋ฒ์ ์ฝ์ ํ๊ณ ๋ฐฉ๋ฌธ๋ ธ๋๋ก ์ฒดํฌํฉ๋๋ค.
int visit []
1
|
1
|
0
|
0
|
0
|
0
|
stack <int>
0
|
1
|
|
|
|
|
3. 1๋ฒ ๋ ธ๋์ ์ด์ํ ๋ ธ๋์ธ 3, 4๊ฐ ์์ผ๋ฏ๋ก ์ฐ์ ์์์ ์ํด 3๋ฒ์ stack์ ๋ฃ๊ณ ๋ฐฉ๋ฌธ๋ ธ๋๋ก ์ฒดํฌํฉ๋๋ค.
int visit []
1
|
1
|
0
|
1
|
0
|
0
|
0
|
1
|
3
|
|
|
|
4. 3๋ฒ๋ ธ๋์ ์ด์ํ ๋ ธ๋๊ฐ ์์ผ๋ฏ๋ก 3๋ฒ๋ ธ๋๋ฅผ stack์์ popํ์ฌ ๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋ ธ๋๊ฐ ์๋์ง ํ์ธํฉ๋๋ค.
int visit []
1
|
1
|
0
|
1
|
0
|
0
|
0
|
1
|
|
|
|
|
5. 1๋ฒ๋ ธ๋์ ์ด์ํ ๋ ธ๋๊ฐ ์์ผ๋ฏ๋ก 1๋ฒ๋ ธ๋๋ฅผ stack์์ popํ์ฌ ๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋ ธ๋๊ฐ ์๋์ง ํ์ธํฉ๋๋ค.
int visit []
1
|
1
|
0
|
1
|
0
|
0
|
stack <int>
0
|
|
|
|
|
|
6. 0๋ฒ ๋ ธ๋์ ๋ฐฉ๋ฌธํ์ง ์์ ์ด์๋ ธ๋ 2๊ฐ ์์ผ๋ฏ๋ก stack์ 2๋ฒ์ ์ฝ์ ํ๊ณ ๋ฐฉ๋ฌธ๋ ธ๋๋ก ์ฒดํฌํฉ๋๋ค.
int visit []
1
|
1
|
1
|
1
|
0
|
0
|
stack <int>
0
|
2
|
|
|
|
|
7. stack์ด ๋น ๋๊น์ง ์์ ๊ณผ์ ์ ๋ฐ๋ณตํฉ๋๋ค.
[ C++ ์ฝ๋ ]
1) Stack์ ์ด์ฉํ ๋ฐฉ๋ฒ
#include <iostream>
#include <vector>
#include <stack>
#include <algorithm>
using namespace std;
vector<int> v[1001];//๋
ธ๋ ์ ๋ณด๋ฅผ ๋ด์ ๋ณ์
int visit_dfs[1001] = { 0, };//๋ฐฉ๋ฌธ์ฌ๋ถ๋ฅผ ๋ด์ ๋ณ์
void dfs(int s) {
stack<int> stk;
visit_dfs[s] = true;//์์๋
ธ๋ ๋ฐฉ๋ฌธํ์!
stk.push(s); //stack์ ์ฝ์
cout << s << " ";
while (!stk.empty()) { //stack์ด ๋น ๋๊น์ง ๋ฐ๋ณต
int x = stk.top(); //stack์ ๋งจ ์ ๋
ธ๋ ๊ฐ์ ํ์
stk.pop(); //๋งจ ์ ๋
ธ๋ ๋ฒ๋ฆฌ๊ธฐ
for (int i = 0; i < v[x].size(); i++) //x์ ์ด์๋
ธ๋์ ๊ฐ์๊น์ง ๋ฐ๋ณต
{
int y = v[x][i]; //์ด์๋
ธ๋๋ฅผ y๋ก ์ง์
if (!visit_dfs[y]) { //y๋ฅผ ๋ฐฉ๋ฌธํ์ ์ด ์์ผ๋ฉด
cout << y << " ";
visit_dfs[y] = true; //๋ฐฉ๋ฌธํ๋ค๊ณ ์ฒดํฌ
stk.push(x); //popํ์๊ธฐ ๋๋ฌธ์ ๋ค์ stack์ x ์ฝ์
ํด์ ๊ฒ์ฌ(x์ ์ด์๋
ธ๋์ ๊ฐ์๊น์ง ๋ฐ๋ณตํด์ผํ๋๊น)
stk.push(y); //stack์ y๋ ์ฝ์
break;
}
}
}
}
int main() {
int V, E, S;//๋
ธ๋, ์ฃ์ง, ์์๋
ธ๋
cin >> V >> E >> S;
int v1, v2;
for (int i = 1; i <= E; i++) {//์ฐ๊ฒฐ๋ ๋
ธ๋์ ๋ณด๋ฅผ ์
๋ ฅํ๋ฉด ๋ฒกํฐ๋ก ์ด์ด์ฃผ๊ธฐ
cin >> v1 >> v2;
v[v1].push_back(v2);
v[v2].push_back(v1);
}
for (int i = 1; i < V; i++) {//์ค๋ฆ์ฐจ์ ์ ๋ ฌ
sort(v[i].begin(), v[i].end());
}
dfs(S);
}
2) ์ฌ๊ทํธ์ถ์ ์ด์ฉํ ๋ฐฉ๋ฒ
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
vector<int> graph[1001];
bool check[10001];
void dfs(int v) {
check[v] = true;//๋ฐฉ๋ฌธ๋
ธ๋๋ก ์ฒดํฌ
cout << v << " ";
for (int i = 0; i < graph[v].size(); i++) {//์ด์ ๋
ธ๋ ํ์
int next = graph[v][i];
if (check[next] == false) {//์ด์ ๋
ธ๋๊ฐ ๋ฐฉ๋ฌธ์ํ ๋
ธ๋๋ผ๋ฉด
dfs(next);//๊ทธ ๋
ธ๋๋ฅผ ๋ฐฉ๋ฌธํจ์ผ๋ก์จ DFSํ์!
}
}
}
int main() {
int V, E, S; //๊ฐ์ ์, ์ฃ์ง ์, ์์๋
ธ๋
cin >> V >> E >> S;
int v1, v2;
for (int e = 0; e < E; e++) {//๋
ธ๋ ์ฐ๊ฒฐ
cin >> v1 >> v2;
graph[v1].push_back(v2);
graph[v2].push_back(v1);
}
for (int i = 1; i <= V; i++) {//์์ฐจ์ ์ธ ๋
ธ๋์ ๊ทผ์ ์ํด ์ค๋ฆ์ฐจ์ ์ ๋ ฌํด์ฃผ๊ธฐ
sort(graph[i].begin(), graph[i].end());
}
dfs(S);
}