728x90
728x90
문제
그래프를 DFS로 탐색한 결과와 BFS로 탐색한 결과를 출력하는 프로그램을 작성하시오. 단, 방문할 수 있는 정점이 여러 개인 경우에는 정점 번호가 작은 것을 먼저 방문하고, 더 이상 방문할 수 있는 점이 없는 경우 종료한다. 정점 번호는 1번부터 N번까지이다.
입력
첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사이에 여러 개의 간선이 있을 수 있다. 입력으로 주어지는 간선은 양방향이다.
출력
첫째 줄에 DFS를 수행한 결과를, 그 다음 줄에는 BFS를 수행한 결과를 출력한다. V부터 방문된 점을 순서대로 출력하면 된다.
풀이
dfs는 재귀로 bfs는 큐로 정석으로 풀었당 ..앞서 푼 그래프 문제를 다시 풀려니 헷갈린다 헷갈려 ,,,dfs나 bfs 개념은 이해해도 이런 요리조리 구현하는 것은 쉽지않네요,, 많이 풀어봐야 할듯.
#include <bits/stdc++.h>
using namespace std;
int number = 7;
int visited[1001];
vector <int> a[1001];
void dfs(int x) { // dfs
if (visited[x]) return;
visited[x] = true;
cout << x << ' ';
for (int i = 0; i < a[x].size(); i++) {
int y = a[x][i];
dfs(y); // 재귀
}
}
void bfs(int start) {
visited[start] = true;
queue<int> q;
q.push(start);
while (!q.empty()) {
int x = q.front();
cout << x << ' ';
q.pop();
for (int i = 0; i < a[x].size(); i++) {
int y = a[x][i];
if (!visited[y]) {
q.push(y);
visited[y] = true; // 방문 처리
}
}
}
}
int main() {
int node, edge, start_node;
cin >> node >> edge >> start_node;
int x, y;
for (int i = 0; i < edge; i++) {
cin >> x >> y;
a[x].push_back(y);
a[y].push_back(x);
}
for (int i = 1; i <= node; i++) { // 정점 번호 작은 것 부터 방문
sort(a[i].begin(), a[i].end());
}
dfs(start_node);
cout << '\n';
memset(visited, 0, sizeof(visited)); // 방문한 것 초기화
bfs(start_node);
}
728x90
728x90
'Algorihtm > BOJ' 카테고리의 다른 글
C++ 백준 4963번 : 섬의 개수 (0) | 2023.11.08 |
---|---|
C++ 백준 10431번 : 줄세우기 (1) | 2023.11.04 |
C++ 백준 11728번 : 배열 합치기 (0) | 2023.10.22 |
C++ 백준 2003번 : 수들의 합 2 (1) | 2023.10.21 |
C++ 백준 2018번 : 수들의 합 5 (1) | 2023.10.19 |