코테 끄적임
[백준 1206 ] DFS와 BFS
algohun
2024. 12. 3. 03:27
펄어비스 코테 준비로 백준 문제이지만 프로그래머스 스타일로 코딩해봤다.
백준 1206는 DFS와 BFS 모두 구현해야하는 문제다.
https://www.acmicpc.net/problem/1260
//예제 입력 2
5 5 3
5 4
5 2
1 2
3 4
3 1
//예제 출력 2
3 1 2 5 4
3 1 4 2 5
//예제 입력 3
1000 1 1000
999 1000
//예제 출력 3
1000 999
1000 999
예제 2를 보고 양방향 연결이라는 걸 알 수 있었다.
예제 입력3을 보고 graph를 vector 대신 map<int, vector<int>>로 처리하고 visited은 set으로 처리해야 한다고 판단했다.
왜냐하면 vector<vector<int>>를 사용하면 정점 번호가 1부터 1000까지 모두 할당되므로, 1000개의 빈 벡터가 생성되고
visited도 vector<int> 사용시 1000개의 공간을 할당해야 하기 때문이다.
#include <iostream>
#include <set>
#include<vector>
#include<algorithm>
#include<queue>
#include<map>
using namespace std;
void DFS(map<int, vector<int>>& graph, set<int>& visited, vector<int>& answer, int n) {
visited.insert(n);
answer.push_back(n);
for (int neighbor : graph[n]) {
if (visited.count(neighbor) == 0) {
DFS(graph, visited, answer, neighbor);
}
}
}
void BFS(map<int, vector<int>>& graph,vector<int>& answer, int start) {
set<int> visited;
visited.insert(start);
answer.push_back(start);
queue<int> q;
q.push(start);
while (!q.empty()) {
int c_n = q.front();
q.pop();
for (int n : graph[c_n]) {
if (visited.count(n) == 0) {
visited.insert(n);
answer.push_back(n);
q.push(n);
}
}
}
}
void solution(int N, int M, int start, map<int,vector<int>>& graph) {
for (auto& g : graph) {
sort(g.second.begin(), g.second.end());
}
vector<int> dfs_answer;
vector<int> bfs_answer;
set<int> visited;
DFS(graph, visited, dfs_answer, start);
BFS(graph, bfs_answer, start);
for (int n : dfs_answer) {
cout << n << " ";
}
cout << '\n';
for (int n : bfs_answer) {
cout << n << " ";
}
}
int main()
{
int N, M, V;
cin >> N >> M >> V;
map<int, vector<int>> graph;
for (int i = 0; i < M; ++i) {
int n1, n2;
cin >> n1 >> n2;
graph[n1].push_back(n2);
graph[n2].push_back(n1);
}
solution(N, M, V, graph);
}
조건 없이 탐색만 하면 되는 쉬운 문제였다.