문제
그래프를 DFS로 탐색한 결과와 BFS로 탐색한 결과를 출력하는 프로그램을 작성하시오.
단, 방문할 수 있는 정점이 여러 개인 경우에는 정점 번호가 작은 것을 먼저 방문하고, 더 이상 방문할 수 있는 점이 없는 경우 종료한다.
정점 번호는 1번부터 N번까지이다.
https://www.acmicpc.net/problem/1260
1260번: DFS와 BFS
첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사
www.acmicpc.net
개요
문제를 보면 제일 먼저 그래프 문제인 척하는 트리문제라는 생각이 든다.
단지, 자식노드와 부모노드의 관계가 아닌 정점과 정점사이의 관계라는 것 외에는 다른 점이 없다.
만약 본인이 아직 DFS와 BFS에 대해 잘 모르고 구현해 본 적이 없다면 관련 개념을
한 번 확인 해보면 쉽게 풀 수 있을 것이다.
개념
그래프는 '정점'과 '간선' 두가지로 이루어져 있다.
그래프 내부에 있는 각 노드들을 '정점(vertex)'이라고 부르고, 그 정점과 정점 사이를 이어주는 것을 '간선(edge)'이라고 부른다.
그래프에는 여러 가지 종류가 있다. 하지만 크게 두 가지로 볼 수 있는데,
첫 번째는 directed graph : 방향을 가지는 그래프
두 번째는 undirected graph : 방향을 가지지 않는 그래프
이번 문제에서는 간선이 양방향이므로 undirected graph를 사용하게 될 것이다.
과정
그래프의 구현 방식은 인접행렬, 인접리스트 두 가지가 있다.
두 개의 정확한 차이점은 다른 글에서 다루도록 하고 이번 문제에서는 인접 리스트를 이용해 풀 것이다.
(직접 전부 구현하기에는 난이도 있는 문제가 아니어서 STL을 이용해 간단하게 풀었다.)
vector<int> 자료형의 배열을 만들어 각 정점마다 간선으로 연결되어 있는 다른 정점을 push 해주는 것만으로도
그래프를 작성할 수 있고 그다음에 dfs와 bfs함수를 작성하고 실행만 해주면 간단하게 풀린다.
이때 주의할 점은 간선이 양방향이므로 한쪽 방향으로만 push 하는 것이 아닌 반대방향도 해주어야 한다.
코드
#include<iostream>
#include<vector>
#include<queue> //bfs를 위한 Q
#include<algorithm>
using namespace std;
vector<int> graph[1001]; //** 자료형이 vector<int> 인 배열을 생성 (index 1001개)
bool visited[1001] = {false, };
void dfs(int cur){
if(visited[cur]==true){
return;
}
visited[cur]=true;
cout << cur <<' ';
for(int next : graph[cur]){ //현재 vertex와 연결되어 있는 다른 vertex 탐색 후 dfs 실행
dfs(next);
}
}
void bfs(int root){ //bfs
queue<int> q;
q.push(root);
visited[root] =true;
while(!q.empty()){
int cur = q.front();
q.pop();
cout << cur << ' ';
for(int next : graph[cur]){
if(visited[next]==false){
q.push(next);
visited[next]=true;
}
}
}
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
int ver, edg, root;
cin >> ver >> edg >> root;
int a, b;
for(int i = 1; i<=edg; i++){
cin >> a >> b;
graph[a].push_back(b);
graph[b].push_back(a);
}
for(int i = 1; i<=ver; i++){
sort(graph[i].begin(),graph[i].end());
}
dfs(root);
for(int i = 1; i<=ver; i++){ //dfs 실행 후에 visited 다시 초기화
visited[i] = false;
}
cout<<'\n';
bfs(root);
}
'BaekJoon' 카테고리의 다른 글
Tree[DFS] - 1967 C++ (0) | 2023.08.10 |
---|---|
Graph [Adjacency List] - 4803 C++ (0) | 2023.08.10 |
Brute Force -10881 C++ (0) | 2023.08.02 |
Brute Force, Greedy - 2590 C++ (0) | 2023.08.02 |
2 Dimentional array - 2563 C++ (0) | 2023.07.11 |