알고리즘 문제풀이/백준
[C++] 백준 1260 - DFS와 BFS
jiminai
2023. 8. 6. 08:24
반응형
https://www.acmicpc.net/problem/1260
1260번: DFS와 BFS
첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사
www.acmicpc.net
<알고리즘 분류>
- 그래프 탐색(Graph Search)
- 너비 우선 탐색(Breadth-First Search)
- 깊이 우선 탐색(Depth-First Search)
<풀이>
1. DFS와 BFS의 기본 개념을 잘 이해하고, 이를 코드에 적용할 수 있는지를 스스로 판단할 수 있는 대표적인 좋은 문제다.
2. 문제에서 시키는 대로, DFS와 BFS 코드 공식을 활용해서 풀어내면 된다.
<주의사항>
1. DFS는 재귀 함수(Recursion Function)를 이용한다. visited배열을 통해 방문한 노드를 체크하고, 검증한다.
2. BFS는 큐(queue)를 이용한다. 현재의 점과 연결되어 있는지와 방문 여부를 확인하고, 그에 따라 queue에 push한다.
<코드>
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
int graph[1001][1001] = {0,};
queue<int> q;
int visited[1001];
int N;
int reset(){
for (int i=0; i<=1000; i++)
{
visited[i] = 0;
}
return 0;
}
void dfs(int start){
visited[start] = true;//현재 점과 연결돼있고 방문되지 않았으면 visit 하기. 그리고 재귀 !
cout << start << " ";
for (int i=1; i<=N; i++)
{
if(graph[start][i] == 1 && !visited[i])
dfs(i);
}
}
void bfs(int start){
q.push(start);
visited[start] = true;
cout << start << " ";
while (!q.empty()){
//큐에 값이 있을 경우 반복 실행.
// 큐에 값이 있다는 것은? 아직 방문하지 않은 노드가 있다!
int x = q.front();
q.pop();
for (int i=1; i<= N; i++) // 현재의 점과 연결돼있고 방문되지 않은 노드면 push
{
if(graph[x][i] && !visited[i])
{
q.push(i);
visited[i] = true;
cout << i << " ";
}
}
}
}
int main(){
int M, V, A, B;
cin >> N >> M >> V;
for (int i=0; i<M; i++)
{
cin >> A >> B;
graph[A][B] = 1;
graph[B][A] = 1;
}
reset();
dfs(V);
cout << "\n";
reset();
bfs(V);
}
반응형