728x90
반응형

1260번: DFS와 BFS
문제
https://www.acmicpc.net/problem/1260
1260번: DFS와 BFS
첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사
www.acmicpc.net
풀이
dfs와 bfs의 기본 사용 방법을 연습할 수 있는 문제다. 간선이 양방향이므로 x, y를 입력받아 graph[x][y] = 1, graph[y][x] = 1로 해준다.
시작 정점부터 dfs를 돌리면 방문처리를 한 후 정점에서 연결된 위치가 아직 방문하지 않았다면 해당 정점으로 dfs를 다시 진행한다. 이를 반복하여 계속해서 가능한 끝까지 탐색한 후 돌아와 다시 다음 정점을 확인하는 방식이다.
이후 모든 방문 처리를 취소하고 bfs를 진행한다. 시작 정점을 방문처리 한 후 큐에 넣는다. 큐가 비어있지 않은 동안, 큐의 front인 정점에서 이동할 수 있는 모든 점들을 방문처리하고 큐에 추가하는 과정을 반복한다.
코드
#include <bits/stdc++.h>
using namespace std;
int n, m, v;
vector<vector<int>> graph(1001, vector<int>(1001, 0));
vector<bool> visited(1001, false);
void dfs(int start) {
visited[start] = true;
cout << start << ' ';
for (int i = 1; i <= n; i++)
if (graph[start][i] == 1 && !visited[i])
dfs(i);
}
void bfs(int start) {
queue<int> q;
q.push(start);
visited[start] = true;
cout << start << ' ';
while (!q.empty()) {
int x = q.front();
q.pop();
for (int i = 1; i <= n; i++)
if (graph[x][i] == 1 && !visited[i]) {
q.push(i);
visited[i] = true;
cout << i << ' ';
}
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cin >> n >> m >> v;
while (m--) {
int x, y;
cin >> x >> y;
graph[x][y] = 1;
graph[y][x] = 1;
}
dfs(v);
cout << '\n';
for (int i = 1; i <= n; i++)
visited[i] = 0;
bfs(v);
return 0;
}
728x90
반응형
'Problem Solving > BOJ' 카테고리의 다른 글
[백준 / BOJ] C++ 17609 회문 (0) | 2023.02.12 |
---|---|
[백준 / BOJ] C++ 1264 모음의 개수 (0) | 2023.02.12 |
[백준 / BOJ] C++ 1259 팰린드롬수 (0) | 2023.02.12 |
[백준 / BOJ] C++ 1237 정ㅋ벅ㅋ (0) | 2023.02.12 |
[백준 / BOJ] C++ 27467 수학 퀴즈 (0) | 2023.02.12 |