DFS와 BFS
https://www.acmicpc.net/problem/1260
시간 제한 | 메모리 제한 | 제출 | 정답 | 맞힌 사람 | 정답 비율 |
---|---|---|---|---|---|
2 초 | 128 MB | 208632 | 77192 | 45837 | 35.992% |
문제
그래프를 DFS로 탐색한 결과와 BFS로 탐색한 결과를 출력하는 프로그램을 작성하시오.
단, 방문할 수 있는 정점이 여러 개인 경우에는 정점 번호가 작은 것을 먼저 방문하고, 더 이상 방문할 수 있는 점이 없는 경우 종료한다.
정점 번호는 1번부터 N번까지이다.
입력
첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다.
다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사이에 여러 개의 간선이 있을 수 있다.
입력으로 주어지는 간선은 양방향이다.
출력
첫째 줄에 DFS를 수행한 결과를, 그 다음 줄에는 BFS를 수행한 결과를 출력한다.
V부터 방문된 점을 순서대로 출력하면 된다.
예제 입력 1
4 5 1 1 2 1 3 1 4 2 4 3 4
예제 출력 1
1 2 4 3 1 2 3 4
예제 입력 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
출처
- 문제를 만든 사람: author5
- 데이터를 추가한 사람: dfghcvb11, djm03178, doju
- 어색한 표현을 찾은 사람: doju
- 빠진 조건을 찾은 사람: pumpyboom
알고리즘 분류
DFS와 BFS의 기본적인 개념을 묻는 문제
통과된 코드
#include<iostream> #include<queue> using namespace std; #define MAX 1001 int N, M, V; // 정점의 개수, 간선의 개수, 시작 정점 int map[MAX][MAX]; // 인접 행렬의 그래프 bool visited[MAX]; // 정점의 방문 여부 queue<int> q; void Reset() { for (int i = 0; i <= N; i++) { visited[i] = 0; // 방문 초기화 } } void DFS(int v) { // 해당 정점 방문으로 변경 visited[v] = true; cout << v << " "; for (int i = 1; i <= N; i++) { // 현재 정점과 연결되어있고 방문 되지 않았으면 실행 if (map[v][i] == 1 && visited[i] == 0) { DFS(i); // 재귀 } } } void BFS(int v) { q.push(v); // 해당 점점 queue에 푸시 visited[v] = true; // 해당 정점 방문으로 변경 cout << v << " "; while(!q.empty()) // queue가 비어있지 않으면 실행 { v = q.front(); // queue 제일 앞에 있는 원소를 반환 q.pop(); // queue 제일 앞에 있는 원소를 반환 for (int j = 1; j <= N; j++) { // 현재의 정점과 연결되어 있고 방문 되지 않았으면 실행 if (map[v][j] == 1 && visited[j] == 0) { q.push(j); visited[j] = true; cout << j << " "; } } } } int main() { cin >> N >> M >> V; for (int i = 0; i < M; i++) { int a, b; cin >> a >> b; map[a][b] = 1; map[b][a] = 1; } Reset(); DFS(V); cout << '\n'; Reset(); BFS(V); return 0; }
알고리즘 관련 개념이 없어서 시간을 많이 소요했다.