๋ฌธ์ : ๋ฐฑ์ค 1260๋ฒ _ DFS์ BFS
์๊ฐ ์ ํ | ๋ฉ๋ชจ๋ฆฌ ์ ํ | ์ ์ถ | ์ ๋ต | ๋ง์ ์ฌ๋ | ์ ๋ต ๋น์จ |
---|---|---|---|---|---|
2 ์ด | 128 MB | 87845 | 28912 | 16832 | 31.543% |
๋ฌธ์
๊ทธ๋ํ๋ฅผ DFS๋ก ํ์ํ ๊ฒฐ๊ณผ์ BFS๋ก ํ์ํ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค. ๋จ, ๋ฐฉ๋ฌธํ ์ ์๋ ์ ์ ์ด ์ฌ๋ฌ ๊ฐ์ธ ๊ฒฝ์ฐ์๋ ์ ์ ๋ฒํธ๊ฐ ์์ ๊ฒ์ ๋จผ์ ๋ฐฉ๋ฌธํ๊ณ , ๋ ์ด์ ๋ฐฉ๋ฌธํ ์ ์๋ ์ ์ด ์๋ ๊ฒฝ์ฐ ์ข ๋ฃํ๋ค. ์ ์ ๋ฒํธ๋ 1๋ฒ๋ถํฐ N๋ฒ๊น์ง์ด๋ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ์ ์ ์ ๊ฐ์ N(1 ≤ N ≤ 1,000), ๊ฐ์ ์ ๊ฐ์ M(1 ≤ M ≤ 10,000), ํ์์ ์์ํ ์ ์ ์ ๋ฒํธ V๊ฐ ์ฃผ์ด์ง๋ค. ๋ค์ M๊ฐ์ ์ค์๋ ๊ฐ์ ์ด ์ฐ๊ฒฐํ๋ ๋ ์ ์ ์ ๋ฒํธ๊ฐ ์ฃผ์ด์ง๋ค. ์ด๋ค ๋ ์ ์ ์ฌ์ด์ ์ฌ๋ฌ ๊ฐ์ ๊ฐ์ ์ด ์์ ์ ์๋ค. ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋ ๊ฐ์ ์ ์๋ฐฉํฅ์ด๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ DFS๋ฅผ ์ํํ ๊ฒฐ๊ณผ๋ฅผ, ๊ทธ ๋ค์ ์ค์๋ BFS๋ฅผ ์ํํ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ค. V๋ถํฐ ๋ฐฉ๋ฌธ๋ ์ ์ ์์๋๋ก ์ถ๋ ฅํ๋ฉด ๋๋ค.
๋์ ๋ต
- ์ฒ์์ ์๋ฌด๊ฒ๋ ๋ชจ๋ฅด๊ณ ๊ตฌํํ ๋ต์ด๋ค. (๋ณด์ง ๋ง๊ณ ๋๋ฒ์งธ ๋ต์ผ๋ก ๋์ด๊ฐ๋ ์ข๋ค.)
/*
2020-03-20 ์ฐํฌ์
BFS, DFS algorithm
*/
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <set>
#include <vector>
#include <algorithm>
using namespace std;
set<int> arr[10001];
set<int> num_list;
void makeLine(int a, int b) {
arr[a].insert(b);
arr[b].insert(a);
}
void setNumList(int num) {
for (int i = 1; i < num+1; i++) {
num_list.insert(i);
}
}
/*
vector<int> quickSorting(vector<int>&v) {
vector<int> result;
vector<int>::iterator iter;
}
*/
void qsort(vector<int>&v, int s, int e) {
int pivot = v[s];
int bs = s, be = e;
while (s < e) {
while (pivot <= v[e] && s < e) e--;
if (s > e) break;
while (pivot >= v[s] && s < e) s++;
if (s > e) break;
swap(v[s], v[e]);
}
swap(v[s], v[e]);
if (bs < s)
qsort(v, bs, s - 1);
if (be > e)
qsort(v, s + 1, be);
}
void BFS(vector<int> bfs_list) {
set<int>::iterator iter;
vector<int>::iterator bfs_list_iter;
vector<int> tmp;
if (num_list.empty()) {
return;
}
for (bfs_list_iter = bfs_list.begin(); bfs_list_iter!=bfs_list.end(); ++bfs_list_iter) {
if (num_list.erase(*bfs_list_iter)) {
cout << *bfs_list_iter << " ";
}
int j = 0;
for (iter = arr[*bfs_list_iter].begin(); iter != arr[*bfs_list_iter].end(); ++iter) {
int x = *std::next(arr[*bfs_list_iter].begin(), j++);
if (find(tmp.begin(), tmp.end(), x)==tmp.end()) {
tmp.push_back(x);
}
}
}
if (tmp.size() == 0) { // ์ฐ๊ฒฐ๋ ๊ฐ์ ์ด ์๋ ๊ฒฝ์ฐ
return;
}
qsort(tmp, 0, tmp.size()-1);
BFS(tmp);
}
void DFS(int start) {
set<int>::iterator iter;
set<int> tmp;
if (num_list.empty()) { // ๋ชจ๋ ์ ์ ๋ค๋ ์ผ๋ฉด return
return;
}
if (num_list.erase(start)) { // ์ด๋ฏธ ๋ค๋ฅธ ์ ์ ์ด๊ฑฐ๋ start๊ฐ ๋น์ด์๋ ๊ฒฝ์ฐ return (*)
cout << start << " ";
}else {
return;
}
for (iter = arr[start].begin(); iter != arr[start].end(); ++iter) { // ์ฐ๊ฒฐ๋ ๊ฐ์ ์ด ์์ผ๋ฉด ํ ๋ฒ ๋ ์ฌ๊ท๋ฅผ ๊ฑฐ์ณ (*) ํ์๋ ๊ณณ์์ ์ฒ๋ฆฌ
DFS(*iter);
}
}
int main() {
int n, m, v;
cin >> n >> m >> v;
for (int i = 0; i < m; i++) {
int n1, n2;
cin >> n1 >> n2;
makeLine(n1, n2);
}
setNumList(n);
DFS(v);
cout << endl;
vector<int> tmp_v;
tmp_v.push_back(v);
setNumList(n);
BFS(tmp_v);
}
1)BFS ๊ตฌํ ๋ฐฉ์
DFS๋ ์ฌ๊ท๋ก ๊ตฌํํ๋ ์ธก๋ฉด์์ ๋๊ฐ์ด ์๊ฐํ์ง๋ง, BFS๋ฅผ ์ด๋ป๊ฒ ๊ตฌํํด์ผํ ์ง ๊ฐ์ด ์ค์ง ์์๋ค. ๊ทธ๋์ BFS๋ ์ฌ๊ท๋ก ๊ตฌํํ๋ ํ๊บผ๋ฒ์ ์๋ฃ๊ตฌ์กฐ์ ๋ฃ๋ ๋ฐฉ์์ ํ์ฉํ๋๋ฐ ์ด๋ป๊ฒ ๋ณด๋ฉด ํ๋ฅผ ํ ๋จ๊ณ์ฉ ์ชผ๊ฐ์ ์ฌ์ฉํ ๊ฒ์ด๋ผ๊ณ ๋ณด๋ฉด ๋ ๊ฒ ๊ฐ๋ค. ๋ฌธ์ ๋ ํ ์๋ฃ๊ตฌ์กฐ ํ๋๋ก ํด๊ฒฐ๋ ๋ฐฉ์์ ์์ฒญ๋ ์กฐ๊ฑด์ ์ค์ผ ํด์ผํด์ ํจ์จ์ฑ์ด ๊ทนํ ์ค์๋ค๋ ์ ์ด๋ค. (์ด๋ฌํ ๋ฐฉ์ ๋๋ฌธ์ sorting ์ฝ๋๊ฐ ํ์ํ๊ธฐ๋ ํ๋ค.)
2)๊ธฐ์ ์ฌ๋ก
์ฒ์์ ๋ฐ๋ณด๊ฐ์ด ๊ธฐ์ ์ฌ๋ก๋ฅผ ์ ์ฒด ๋ ธ๋ (1~N)๋ฅผ ๋ชจ๋ ์ํํ๋ ๊ฒ๋ ํฌํจ์์ผฐ๋ค. ์๋ ๊ธฐ์ ์ฌ๋ก๋ ์ฐ๊ฒฐ๋ ๋ค์ ๋ ธ๋๊ฐ ์๊ฑฐ๋ ์ฐ๊ฒฐ๋ ๋ ธ๋๋ฅผ ์ด๋ฏธ ๋ชจ๋ ๋ค๋ ์ ๊ฒฝ์ฐ์ด๋ค.
3)์ด๋ฏธ ๋ค๋ฅธ ๋ ธ๋ ์ฒดํฌ ๋ฐฉ์
๋๋ถ๋ถ์ ์ฝ๋์์ check๋ผ๋ ๋ฐฐ์ด์ nํฌ๊ธฐ๋งํผ ๋ง๋ค์ด์ ๊ฑฐ๊ธฐ์ ๋ค๋ ์ผ๋ฉด 1์ ํ์ํ๊ฒ ํด๋์๋ค. 2๋ฒ์ ์๋ชป๋ ์๊ฐ์ ํ ์ดํ 1~N๊น์ง์ ์ ์ฒด ๋ ธ๋๋ฅผ ๋ชจ๋ ์์ด๋ค๋ ๊ฑธ ์ฝ๊ฒ ์๊ธฐ ์ํด check๋ฅผ num_list๋ผ๋ set ์๋ฃ ๊ตฌ์กฐ๋ก ๊ตฌํํ์๋ค. ๋ ธ๋์ ๋๋ฌํ๋ฉด ํด๋น ์ซ์๋ฅผ num_list์์ ์ญ์ ํ๋ ๋ฐฉ์์ด๋ค.
<์ฌ๊ธฐ์๋ถํฐ ๋ด์ฃผ์ธ์>
- BFS, DFS์ ๋ํ ์ด๋ก ๊ณต๋ถ ํ ๋ค์ ๊ตฌํํ ์ฝ๋
/*
2020-03-20 ์ฐํฌ์
BFS, DFS algorithm
*/
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <set>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
set<int> arr[1001];
set<int> num_list;
void makeLine(int a, int b) { // ๊ฐ์ ์์ฑ
arr[a].insert(b);
arr[b].insert(a);
}
void setNumList(int num) {
for (int i = 1; i < num+1; i++) {
num_list.insert(i);
}
}
void BFS(int start) {
queue<int> bfs_q;
set<int>::iterator iter;
bfs_q.push(start);
while (bfs_q.size()) {
int tmp = bfs_q.front();
bfs_q.pop(); // ๋
ธ๋ queue์์ ์ ์ธ
if (num_list.erase(tmp)) { // ๋
ธ๋๋ฅผ ์ด๋ฏธ ๋ฐฉ๋ฌธํ์์ ํ์
cout << tmp << " "; // ๋
ธ๋ ํ๋ฆฐํธ
for (iter = arr[tmp].begin(); iter != arr[tmp].end(); iter++) {
if (num_list.find(*iter) != num_list.end()) {
bfs_q.push(*iter);
}
}
}
}
}
void DFS(int start) {
set<int>::iterator iter;
set<int> tmp;
if (num_list.erase(start)) { // ์ด๋ฏธ ๋ค๋ฅธ ์ ์ ์ด๊ฑฐ๋ start๊ฐ ๋น์ด์๋ ๊ฒฝ์ฐ return (*)
cout << start << " ";
}else {
return;
}
for (iter = arr[start].begin(); iter != arr[start].end(); ++iter) { // ์ฐ๊ฒฐ๋ ๊ฐ์ ์ด ์์ผ๋ฉด ํ ๋ฒ ๋ ์ฌ๊ท๋ฅผ ๊ฑฐ์ณ (*) ํ์๋ ๊ณณ์์ ์ฒ๋ฆฌ
DFS(*iter);
}
}
int main() {
int n, m, v;
cin >> n >> m >> v;
for (int i = 0; i < m; i++) { // ๊ทธ๋ํ ๋ง๋ค๊ธฐ
int n1, n2;
cin >> n1 >> n2;
makeLine(n1, n2);
}
setNumList(n);
DFS(v);
cout << endl;
setNumList(n);
BFS(v);
}
๋ถํ์ํ ์ฝ๋๋ฅผ ์์ ๊ณ ๊ตฌํํ๋ ํจ์ฌ ๊ฐ๊ฒฐํด์ก๋ค.
๋ ธ๋์ ๊ฐ์ ๋ค๋ก ์ด๋ฃจ์ด์ง ๊ทธ๋ํ ๊ตฌ์กฐ๋ set ์์๋ค์ ๊ฐ์ง๋ ๋ฐฐ์ด(์ ์ญ๋ณ์ arr)๋ก ๋ํ๋ด์๋ค. index 0์ ์ฌ์ฉํ์ง ์์ผ๋ฉฐ 1๋ถํฐ N๊น์ง์ index๋ฅผ ์ฌ์ฉํ์ฌ ์ด ์์๋ค์ ๊ฐ ๋ ธ๋๋ฅผ ํํํ๋ค. ๊ฐ๊ฐ์ index์ ์๋ set ์๋ฃ๊ตฌ์กฐ๋ ํด๋น ๋ ธ๋์ ์ฐ๊ฒฐ๋์ด์๋ ๋ค๋ฅธ ๋ ธ๋์ ์ธ๋ฑ์ค๋ฅผ ์ ์ฅํ๊ณ ์์ผ๋ฉฐ, ์ค๋ณต๋์ง ์๊ณ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ๊ธฐ ์ํด set ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ์๋ค.
set ์๋ฃ๊ตฌ์กฐ๋ ์ค๋ณต๋์ง ์์ง๋ง ์ค๋ฆ์ฐจ์์ธ์ง๋ ํ์ค์น ์๋ค. (์์ง ๋๋ ๋ฌด์จ ๋ง์ธ์ง ๋ชจ๋ฅด๊ฒ ์. ๊ณต๋ถํ๊ธฐ.)
DFS๋ ๊ฑฐ์ ๋ชจ๋ ์ฝ๋๊ฐ ๊ทธ๋ ๋ฏ ์ฌ๊ทํจ์๋ก ๊ตฌํํ์ผ๋ฉฐ, ์ด ๋ฌธ์ ์ ํน์ฑ ์ ์ฐ๊ฒฐ๋ ๊ฐ์ ์ด ์๋ ๋ ธ๋๋ ์์ ์ ์์ผ๋ฏ๋ก ๊ทธ ์กฐ๊ฑด์ ๋ํ ์ฒ๋ฆฌ๋ ๋ฐ๋ก ํด์ฃผ์๋ค. (์ฃผ์์ผ๋ก ํ์๋์ด์์)
BFS๋ queue๋ผ๋ ์๋ฃ๊ตฌ์กฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ import ํ์ฌ ๊ตฌํํ์๋ค. ํ์ ๋ค๋ฅด๋ ๋ ธ๋๋ง๋ค ์ฐจ๋ก๋ก ๋ฃ๊ณ ํ๋์ฉ ๊บผ๋ด๋ฉด์ ํด๋น ๋ ธ๋์ ์ฐ๊ฒฐ๋ ๋ ธ๋ ์ค ์์ง ๋ค๋ฅด์ง ์์ ๋ ธ๋๋ฅผ ํ์ ๋ฃ์ด์ค๋ค. ์ด๋ฐ ์๊ณ ๋ฆฌ์ฆ์ ํ๊ฐ ๋น ๋๊น์ง ๋ฐ๋ณตํ๋ค.
DFS, BFS ์ฝ๋์์ ์ด๋ฏธ ๋ค๋ฅธ ๋
ธ๋์ธ์ง๋ฅผ ์๊ธฐ ์ํด ์ฒ๋ฆฌํ ์กฐ๊ฑด์ num_list.erase(value)
์ ๊ฐ์ด 1์ธ์ง์ด๋ค. set์ด๋ผ๋ ์๋ฃ๊ตฌ์กฐ๋ฅผ ํ์ฉํด์ ํน์ ๋
ธ๋๋ฅผ ๋ค๋ฅผ ๋๋ง๋ค num_list๋ผ๋ ๋ฐฐ์ด์์ ํด๋น index๋ฅผ ์ญ์ ํ๋ ์ฐ์ฐ์ ์ํํ๋๋ฐ ์ด๋ฏธ ๋ค๋ฅธ ๋
ธ๋์ด๋ฉด ํด๋น ์ฐ์ฐ์์ ์ญ์ ํ ๋
ธ๋ ์๊ฐ 0์ด ๋ผ๋ฒ๋ฆฐ๋ค.
์ด ์ฐ์ฐ์ ์ฌ์ฉํ๋ฉด ๋ง์ผ tmp๊ฐ ์ญ์ ๋๋ฉด ์๋๋ ๊ฒฝ์ฐ๋ ๋ค์ num_list.insert(value)
๋ฅผ ํด์ฃผ์ด์ผํ๋๋ฐ, ๊ทธ๋ ๊ฒ ๋๋ฉด ์ธ๋ชจ์๋ ์ฐ์ฐ์ด ๋ง์์ง๋ ๊ผด์ด๋ฏ๋ก ๊ทธ๋ฅ num_list.find(value) != num_list.end()
๋ฅผ ์ฐ๋ฉด๋๋ค. set ์๋ฃ๊ตฌ์กฐ์ find ์ฐ์ฐ์ ํด๋น value๊ฐ ์กด์ฌํ๋ฉด ์กด์ฌํ๋ ๊ณณ์ ์ฃผ์๋ฅผ ๋ฐํํ๊ณ , ์กด์ฌํ์ง ์์ผ๋ฉด set ์๋ฃ๊ตฌ์กฐ์ end() ์์น๋ฅผ ๋ฐํํ๋ค. (end() ์์น๋ ๋ง์ง๋ง ์์ ๋ค์ ์ฃผ์ ๊ฐ์ด๋ค.)
์ด๋ ๊ฒ DFS, BFS๋ฅผ ๊ตฌํํด๋ณด์๋๋ฐ ์์ฃผ ๋์ค๋ ์๊ณ ๋ฆฌ์ฆ์ธ๋งํผ ๋ ๋ง์ ์ฝ๋๋ฅผ ์ฐพ์๋ณด๊ณ ์ต๋ํ ์์ ์ต๊ฒ ์์ฃผ ๋ฐ๋ณตํด๋ณด์์ผ๊ฒ ๋ค. c++์ ์ด์ฉํ๋ค๋ฉด ์๋ฃ๊ตฌ์กฐ๊ฐ ์๋ ์๋์ด์์ด ๋น ๋ฅด๊ฒ ์์ฑํ ์ ์๋ ์ฝ๋์ผ ๋ฏ ํ๋ค.
'Algorithm ๋ฌธ์ > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[c++] ๋ฐฑ์ค 18808๋ฒ : ์คํฐ์ปค ๋ถ์ด๊ธฐ (0) | 2020.03.21 |
---|---|
[c++]๋ฐฑ์ค 17836๋ฒ : ๊ณต์ฃผ๋์ ๊ตฌํด๋ผ! (0) | 2020.03.21 |
[python]๋ฐฑ์ค 17836๋ฒ : ๊ณต์ฃผ๋์ ๊ตฌํด๋ผ! (0) | 2020.03.13 |
[python]๋ฐฑ์ค 17827๋ฒ: ๋ฌํฝ์ด ๋ฆฌ์คํธ (0) | 2020.03.13 |
[python]๋ฐฑ์ค 1699๋ฒ : ์ ๊ณฑ์์ ํฉ (0) | 2020.03.06 |
Comment