[C++] BOJ 1260๋ฒ: DFS์ BFS
๋ฌธ์
์ฒซ์งธ ์ค์ ์ ์ ์ ๊ฐ์ N(1 ≤ N ≤ 1,000), ๊ฐ์ ์ ๊ฐ์ M(1 ≤ M ≤ 10,000), ํ์์ ์์ํ ์ ์ ์ ๋ฒํธ V๊ฐ ์ฃผ์ด์ง๋ค. ๋ค์ M๊ฐ์ ์ค์๋ ๊ฐ์ ์ด ์ฐ๊ฒฐํ๋ ๋ ์ ์ ์ ๋ฒํธ๊ฐ ์ฃผ์ด์ง๋ค. ์ด๋ค ๋ ์ ์ ์ฌ์ด์ ์ฌ๋ฌ ๊ฐ์ ๊ฐ์ ์ด ์์ ์ ์๋ค. ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋ ๊ฐ์ ์ ์๋ฐฉํฅ์ด๋ค.
์ ๋ ฅ
4 5 1
1 2
1 3
1 4
2 4
3 4
์ถ๋ ฅ
1 2 4 3
1 2 3 4
์ฝ๋
#include<iostream>
#include<vector>
#include<queue>
#include<string>
#include<algorithm>
using namespace std;
// 1260๋ฒ DFS์ BFS
//๊น์ด ์ฐ์ ํ์
void dfs(vector<int> inputGraph[], bool *visited,int index) {
visited[index] = true; //๋ฐฉ๋ฌธํ์์ ํ์
cout << index<<" ";
//dfs ํ์ ์์
int grphSize = inputGraph[index].size();
for (int i = 0; i < grphSize; i++) {
int connectIdx = inputGraph[index][i];
if (!visited[connectIdx])
dfs(inputGraph, visited, connectIdx);
}
}
//๋๋น ์ฐ์ ํ์
void bfs(vector<int> inputGraph[],bool *visited,int index) {
queue<int> que;
que.push(index);
visited[index] = true;
//bfs ํ์ ์์
while (!que.empty()) {
int visitIdx = que.front();
que.pop();
cout << visitIdx<<" ";
int grphSize = inputGraph[visitIdx].size();
for (int i = 0; i < grphSize; i++) {
//๋ฐฉ๋ฌธํ Idx์ ์ฐ๊ฒฐ๋ ์์๋ค์ que์ ๋ฃ๊ธฐ
int connectIdx = inputGraph[visitIdx][i];
if (!visited[connectIdx]) { //๋ง์ฝ ์ฐ๊ฒฐ๋ ์์๋ฅผ ๋ฐฉ๋ฌธํ์ง ์์๋ค๋ฉด
que.push(connectIdx); //๋ฐฉ๋ฌธํ ๋
ธ๋๋ก ์ ์
visited[connectIdx] = true;
}
}
}
}
int main() {
int N, M, V; //์ ์ ์ ๊ฐ์, ๊ฐ์ ์ ๊ฐ์, ํ์์ ์์ํ ์ ์ ์ ๋ฒํธ
cin >> N >> M >> V;
int size = N + 1;
//N๊ฐ๋งํผ์ ๋ฐฐ์ด ๋ง๋ค๊ธฐ
bool* visited = new bool[size] {false, }; //๋ฐฉ๋ฌธ ์ ๋ฌด๋ฅผ ์ ์ฅํ๋ ๋ฐฐ์ด
vector<int>* graph = new vector<int>[size];
graph->push_back(1);
for (int i = 0; i < M; i++) {
int origin, connect;
cin >> origin >> connect;
graph[origin].push_back(connect);
graph[connect].push_back(origin);
}
//์ ๋ ฌ
for (int i = 0; i < size; i++) {
sort(graph[i].begin(),graph[i].end());
}
dfs(graph,visited, V);
cout << endl;
visited = new bool[size]{ false, }; //๋ฐฉ๋ฌธ์ ๋ฌด๋ฅผ ๋ค์ ์ด๊ธฐํํด์ค(์ฌ์ฌ์ฉ ์ํด)
bfs(graph, visited,V);
delete [] visited; //๋ฉ๋ชจ๋ฆฌ ํด์
//vector ๋ฉ๋ชจ๋ฆฌ ํด์
graph->clear();
vector<int>().swap(*graph);
return 0;
}
*๊ฐ๋จํ ํด์ค*
DFS์ BFS๋ฅผ ๊ตฌํํ์๋ค. DFS๋ ๋ชจ๋ ๋ ธ๋๋ฅผ ํ์ํ๋๋ก ์์ฑํ์๊ณ , BFS๋ ์ฐ๊ฒฐ๋ ๋ ธ๋๋ฅผ ํตํด์ ํด๋น ๋ ธ๋์ ์ฐ๊ฒฐ๋ ๋ ธ๋ ์ค ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋๋ง ๋ค์ ํ์ํด์ ํ์์ด ๋๋๋ฉด ์ข ๋ฃ๋๋๋ก ์์ฑํ์๋ค. DFS์ BFS์ ๊ฒฝ์ฐ
https://better-tomorrow.tistory.com/entry/DFS-BFS-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0
DFS & BFS ์ดํดํ๊ธฐ ๋ฐ ๊ตฌํ(C++)
DFS : Depth First Search(๊น์ด ์ฐ์ ํ์) - ๊ทธ๋ํ ์ ์ฒด๋ฅผ ํ์ํ๋ ๋ฐฉ๋ฒ ์ค ํ๋. (์๋ฒฝํ ํ์) - ์์์ ๋ถํฐ ๋ค์ branch๋ก ๋์ด๊ฐ๊ธฐ ์ ์ ํด๋น branch๋ฅผ ์๋ฒฝํ๊ฒ ํ์ํ๊ณ ๋์ด๊ฐ๋ ๋ฐฉ๋ฒ. - [์ฌ๊ทํจ์]
better-tomorrow.tistory.com
ํด๋น ํฌ์คํ ์ ํตํด ์์ธํ๊ฒ ๋ฐฐ์ธ ์ ์์๋ค. DFS์ BFS์ ๋ํด ์๊ณ ์ถ์ผ๋ฉด ์์ ๋ธ๋ก๊ทธ๋ฅผ ์ฐธ์กฐํ๋ฉด ์ข์๋ฏํ๋ค.
for (int i = 0; i < M; i++) {
int origin, connect;
cin >> origin >> connect;
graph[origin].push_back(connect);
graph[connect].push_back(origin);
}
์ฐ๊ฒฐ๋ ๋ ธ๋๋ค์ ์ ๋ ฅ๋ฐ๋ ๊ณผ์ ์์ ์ฐ๊ฒฐ๋ 2๊ฐ๋ฅผ ์ ๋ ฅ ๋ฐ์์ ์๋ก ๊ฐ์์ ๋ ธ๋์ ์ฐ๊ฒฐ ์ ๋ณด๋ฅผ ์ ๋ ฅ์ํค๋๋ก ํ๋ค.
//์ ๋ ฌ
for (int i = 0; i < size; i++) {
sort(graph[i].begin(),graph[i].end());
}
์ ๋ ฅ์ํจ ์ ๋ณด๋ค์ sort๋ฅผ ํตํด ์ ๋ ฌ์ ์์ผ์ค๋ค. ์ ๋ ฌ์ ํ์ง ์์ผ๋ฉด ์ํ๋๋๋ก ๊ฒฐ๊ณผ๊ฐ์ด ๋์ค์ง ์๊ธฐ ๋๋ฌธ์ ์ ๋ ฌ์ ๊ผญ ํด์ค๋ค.
*์ด ๋ฐฉ๋ฒ๋ง์ด ๋ง๋ ์ ๋ต์ ์๋๋๋ค.
ํจ์ฌ ์ข๊ณ ๋น ๋ฅธ ๋ค๋ฅธ ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํ ์ ์์ต๋๋ค.
์๊ณ ๋ฆฌ์ฆ ๊ณต๋ถํ์๋ ๋ถ๋ค ํ์ดํ ! '0'/*