일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- VIM
- Redux
- 안드로이드
- network
- DFS
- BFS
- frontend
- 다이나믹 프로그래밍
- 백준
- TypeScript
- Graph
- 프로그래머스
- Algorithm
- Database
- 자바
- 그레이들
- CS
- Data Structure
- git
- 동적 계획법
- LeetCode
- db
- java
- 리트코드
- vscode
- Python
- react
- Javascript
- DP
- 알고리즘
- Today
- Total
늘 겸손하게
백준 - 1260 ( C++ ) DFS 와 BFS 본문
안녕하세요 besforyou입니다.
백준 문제 1260 소개를 시작하겠습니다.
문제 풀이
입력받은 정점과 간선들로 그래프를 생성하고 DFS search, BFS search를 해주면 된다.
DFS 탐색 방법 : https://besforyou.tistory.com/122
Depth First Search for a Graph - 그래프 깊이-우선 탐색
안녕하세요 besforyou 입니다 이번 글에서는 그래프의 DFS에 대해 소개하겠습니다. 출처 : https://www.geeksforgeeks.org/depth-first-search-or-dfs-for-a-graph/ Depth First Search or DFS for a Graph - Geek..
besforyou.tistory.com
BFS 탐색 방법 : https://besforyou.tistory.com/121
Breadth First Search for a Graph - 그래프 넓이-우선탐색
안녕하세요 besforyou 입니다 이번 글에서는 그래프에서의 BFS에 대해 설명(번역)해보겠습니다 출처 : https://www.geeksforgeeks.org/breadth-first-search-or-bfs-for-a-graph/ Breadth First Search or BFS for..
besforyou.tistory.com
코드
필요한 변수들을 전역 변수로 선언합니다.
const int MAX = 1001;
int N, M, V;
int visited[MAX];
int mat[MAX][MAX];
queue<int> q;
우선 주어지는 데이터를 입력받아 그래프를 생성합니다. 정점 사이에 간선이 몇 개 있는지는 알 필요가 없으므로 정점 사이에 간선이 존재하는 것만 나타내 줍니다.
그다음 DFS, BFS를 해주면 됩니다.
int main (void) {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int first, second;
cin >> N >> M >> V;
for ( int i = 0 ; i < M ; i++ ) {
cin >> first >> second;
mat[first][second] = 1;
mat[second][first] = 1;
}
DFS(V);
reset();
BFS(V);
return 0;
}
DFS
void DFS(int v) {
visited[v] = 1;
cout << v << " ";
for ( int i = 1 ; i <= N ; ++i ) {
if ( mat[v][i] == 1 && visited[i] == 0 )
DFS(i);
}
}
깊이-우선 탐색 코드는 간단합니다. 방문한 정점을 기록하고 반복문안에서 현재 정점과 이어져 있고 아직 방문하지 않은 정점이 있다면 그 정점을 인자로 주어 DFS 함수를 재귀적으로 호출합니다.
BFS
void BFS( int s ) {
q.push(s);
visited[s] = 1;
while (!q.empty()) {
s = q.front();
cout << s << " ";
q.pop();
for ( int i = 1 ; i <= N ; ++i) {
if ( mat[s][i] == 1 && visited[i] == 0 ) {
q.push(i);
visited[i] = 1;
}
}
}
}
넓이-우선 탐색입니다.
현재 보고 있는 정점을 전역으로 선언한 큐에 push 하고 방문했다는 기록을 합니다.
큐가 빌 때까지 반복문안에서
큐 가장 앞 원소를 출력하고 큐에서 제거합니다.
이후에 for문안에서 현재 보고 있는 정점과 이어져있고 방문하지 않은 정점이 있다면 해당 정점을 큐에 push 하고 방문하였다는 기록을 합니다.
Reset 함수
void reset() {
for ( int i = 1; i <= N ; i++ ) {
visited[i] = 0;
}
cout << endl;
}
전역으로 선언한 배열 visited를 0으로 초기화하는 함수입니다.
전체 코드
#include <iostream>
//#include <list>
#include <queue>
using namespace std;
const int MAX = 1001;
int N, M, V;
int visited[MAX];
int mat[MAX][MAX];
queue<int> q;
void BFS( int s ) {
q.push(s);
visited[s] = 1;
while (!q.empty()) {
s = q.front();
cout << s << " ";
q.pop();
for ( int i = 1 ; i <= N ; ++i) {
if ( mat[s][i] == 1 && visited[i] == 0 ) {
q.push(i);
visited[i] = 1;
}
}
}
}
void DFS(int v) {
visited[v] = 1;
cout << v << " ";
for ( int i = 1 ; i <= N ; ++i ) {
if ( mat[v][i] == 1 && visited[i] == 0 )
DFS(i);
}
}
void reset() {
for ( int i = 1; i <= N ; i++ ) {
visited[i] = 0;
}
cout << endl;
}
int main (void) {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int first, second;
cin >> N >> M >> V;
for ( int i = 0 ; i < M ; i++ ) {
cin >> first >> second;
mat[first][second] = 1;
mat[second][first] = 1;
}
DFS(V);
reset();
BFS(V);
return 0;
}
결과

'코딩 문제 > 백준' 카테고리의 다른 글
백준 10816 - 숫자 카드 2 ( Java ) (0) | 2021.11.05 |
---|---|
백준 11724 ( Java ) (0) | 2021.10.28 |
백준 2839 - 설탕 배달 ( C++ / Java ) (0) | 2021.09.26 |
백준 7570 - 줄세우기 ( Java ) (0) | 2021.09.24 |
백준 10709 - 기상캐스터 ( C++ ) (0) | 2021.09.08 |