컴퓨터 공학 기초/알고리즘 (BFS, DFS)
백준 1260 (DFS와 BFS)
JongSeok_12
2020. 8. 21. 03:10
https://www.acmicpc.net/problem/1260
1260번: DFS와 BFS
첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사
www.acmicpc.net
해당 문제는 N개의 정점이 주어지면 해당 정점들의 간선의 정보가 주어지면 해당 정점들의 간선을 통해 연결 되어 있는 정점들을 DFS, BFS로 탐색을 하며 탐색되는 각 정점을 출력하는 문제이다.
이때 하나의 정점에 연결 된 간선이 여러개라면 숫자가 작은 정점을 방문하는 조건이 있다.
주의 사항 :
하나의 정점에 간선이 여러개일 경우 숫자가 작은 정점부터 방문해야 하기때문에 입력을 받을 때 해당 정점을 오름차 순으로 정렬을 시켜 두면 방문할때 작은 숫자부터 탐색을 진행할 수 있다.
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
int n, m, v;
vector<int> map[1001];
int usedBfs[1001];
int usedDfs[1001];
void dfs(int v){
cout << v << ' ';
for (int i = 0; i < map[v].size(); ++i){
if (usedDfs[map[v][i]] == 1) continue;
usedDfs[map[v][i]] = 1;
dfs(map[v][i]);
}
}
void bfs(int v){
queue<int> qu;
qu.push(v);
usedBfs[v] = 1;
int tmp;
while (!qu.empty()){
int now = qu.front();
cout << now << ' ';
for (int i = 0; i < map[now].size(); ++i){
if (usedBfs[map[now][i]] == 1) continue;
usedBfs[map[now][i]] = 1;
qu.push(map[now][i]);
}
qu.pop();
}
printf("\n");
return;
}
int main(){
//freopen_s(new FILE*, "tes.text", "r", stdin);
cin >> n >> m >> v;
for (int i = 0; i < m; ++i){
int a, b;
cin >> a >> b;
map[a].push_back(b);
map[b].push_back(a);
// 정렬을 수행하여 작은 정점을 먼저 방문하도록 한다.
sort(map[a].begin(), map[a].end());
sort(map[b].begin(), map[b].end());
}
usedDfs[v] = 1;
dfs(v);
printf("\n");
bfs(v);
}