-
[백준] #1260번: DFS와 BFSProgramming/백준 (c++) 2022. 3. 28. 23:35
https://www.acmicpc.net/problem/1260
문제
그래프를 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
코드
cpp
#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 = 1; 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); visited[v] = true; cout << v << " "; while (!q.empty()) { v = q.front(); q.pop(); for (int w = 1; w <= N; w++) { if (map[v][w] == 1 && visited[w] == 0) { //현재 정점과 연결되어있고 방문되지 않았으면 q.push(w); visited[w] = true; cout << w << " "; } } } } int main() { cin >> N >> M >> V; for (int i = 0; i < M; i++) { int a, b; cin >> a >> b; map[a][b] = 1; // 정점 a와 b가 연결되어있음 (인접행렬) map[b][a] = 1; } reset(); DFS(V); cout << '\n'; reset(); BFS(V); return 0; }
ⓐ 인접행렬 map[][]을 통해 입력받은 정점a,b가 간선으로 연결되어있음을 map[a][b]=1 로 작성
ⓑ reset() 함수를 통해 각 노드의 방문상태를 초기화
ⓒ DFS 함수
→ 우선 DFS함수에 인자로 넘겨받은 숫자의 노드는 방문처리를 한다.
→ 방문처리를 한 숫자를 출력 (방문된 점을 순서대로 출력하는 것이기 때문에)
→ 그 노드와 연결되어있는 노드 중 방문되지 않은 노드가 있다면 그 노드를 DFS함수의 인자로 다시 넘겨준다
ⓓ BFS 함수
→ queue를 이용한다
→ 처음 시작 노드를 queue에 삽입하고 방문처리
→ 방문처리를 한 숫자를 출력
→ queue가 비어있지않다면 맨 앞에있는(이미 방문처리를 한) 노드는 삭제하고 연결된 노드 중 방문처리가 되지 않은 노드를 출력한다
**
DFS는 스택 자료구조를 이용해 재귀적으로 구현하지만 BFS는 큐를 이용한다는 차이가있다
'Programming > 백준 (c++)' 카테고리의 다른 글
[백준] #2750: 수 정렬하기 (삽입정렬) (0) 2022.05.09 [백준] #24444번: 알고리즘 수업 - 너비 우선 탐색 1 (0) 2022.03.29 [백준] #2563번: 색종이 (0) 2022.03.25 [백준] #2490번: 윷놀이 (0) 2022.03.21 [백준] #8979번: 올림픽 (0) 2022.03.21