Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 백준C++
- cuDNN
- 백준1463
- 백준1026
- 패스트캠퍼스
- 조건문
- precision
- tensorflow
- C++ 백준
- 1463
- C++
- 패스트캠퍼스혁펜하임
- 혁펜하임AI
- 백준
- AIDEEPDIVE
- C++ 함수
- c++ 기초
- 반복문
- 백준9095
- 9095
- 비교연산자
- CUDA
- for문
- pytorch
- 혁펜하임
- AI강의
- 혁펜하임강의
- 1로만들기
- 혁펜하임강의후기
- C++ 공백 입력
Archives
- Today
- Total
코딩하는 덕구 🐶
60. C++ 백준 1260 번 DFS 와 BFS 본문
728x90
반응형
안녕하세요. 코딩하는 덕구입니다. C++ 백준 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
stack을 이용해 DFS를 구현했던 파이썬 버전과는 다르게
이번에는 재귀함수를 이용한 DFS를 C++을 통해 구현해보았습니다.
먼저 방문할 노드 v를 입력받고
방문표시를 해줍니다.
이후 해당 노드의 간선을 탐색하여, 다음 탐색할 노드를 물색하고,
만약 간선이 존재하고, 방문하지 않은 노드라면 DFS를 재귀적으로 호출해 해당 노드를 방문합니다.
void DFS(int v) {
visited[v] = true;
cout << v << ' ';
for(int i = 1; i <= N; i++){
if (visited[i] == 0 && map[v][i] == 1) DFS(i);
}
}
다음은 큐를 이용한 BFS 입니다.
선입 선출의 특성을 가지는 큐를 이용하여 (FiFO) First In First Out
해당 큐에는 방문 가능한 후보 노드를 삽입하고
노드를 꺼내면서, 방문하지 않았으면 방문하는 방식의 코드입니다.
먼저 시작 정점인 v를 입력받아 큐에 넣습니다.
1. 해당 노드는 방문처리 해주고,
2. v와 연결된 간선을 살피며, 방문하지 않았다면, queue에 넣습니다.
방문 가능한 후보 노드가 없을 때 까지 1, 2를 반복합니다.
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 << " ";
}
}
}
}
백준 1260 번 C++ 최종 코드입니다.
#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 (visited[i] == 0 && map[v][i] == 1) 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;
map[b][a] = 1;
}
reset();
DFS(V);
cout << '\n';
reset();
BFS(V);
return 0;
}
감사합니다.
728x90
반응형
'알고리즘 문제 풀이' 카테고리의 다른 글
62. C++ 백준 2178 번 미로 탐색 자세한 설명 (0) | 2023.01.01 |
---|---|
61. Python 백준 2178 번 미로 탐색 (2) | 2023.01.01 |
59. Python 백준 1260 번 DFS와 BFS stack, queue를 이용한 풀이. Stack이란? Queue란? Deque 이란? 파이썬 stack, Deque (0) | 2022.12.30 |
58. C++ 백준 1026 번 간단한 풀이, 정석 풀이 (0) | 2022.12.28 |
57. Python 백준 1026 번 간단한 풀이, 정석 풀이 (0) | 2022.12.28 |