1260번: DFS와 BFS
첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사
www.acmicpc.net
[문제 풀이]
DFS와 BFS를 이용하여 문제를 풀었습니다.
이 문제는 그래프를 구성하는 정점과 간선이 주어질 때 그래프 탐색을 DFS와 BFS로 탐색하는 것을 구현하는 문제입니다. 따라서, DFS와 BFS 함수를 구현하여 주었습니다.
DFS 코드 설명
입력으로 주어진 간선을 저장해 둔 map 배열을 N 크기 만큼 돌면서 DFS 함수에 매개변수로 주어진 v 와 연결된 정점을 찾습니다. 연결된 정점이 방문하지 않은 곳이라면 재귀를 이용하여 DFS를 호출해주었습니다.
BFS 코드 설명
먼저 시작 정점 v를 queue에 넣어주고 입력으로 주어진 간선을 저장해 둔 map 배열을 N 크기 만큼 돌면서 v 와 연결 돼 있으면서 방문하지 않은 점을 모두 차례대로 queue에 넣어 주었습니다.
[코드]
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
int N, M, V;
int map[1001][1001] = { 0, };
bool visit[10001] = { false, };
queue<int> pass_queue;
void DFS(int);
void BFS(int);
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> N >> M >> V;
for (int i = 0; i < M; i++) {
int temp1, temp2;
cin >> temp1 >> temp2;
map[temp1][temp2] = 1;
map[temp2][temp1] = 1;
}
DFS(V);
for (int i = 0; i <= N; i++) visit[i] = false;
BFS(V);
return 0;
}
void DFS(int v) {
cout << v << " ";
visit[v] = true;
for (int i = 1; i <= N; i++) {
if (i == v)
continue;
if (map[v][i] == 1 && map[i][v] == 1 && !visit[i])
DFS(i);
}
}
void BFS(int v) {
cout << endl;
pass_queue.push(v);
visit[v] = true;
while (!pass_queue.empty())
{
int temp = pass_queue.front();
for (int i = 1; i <= N; i++) {
if (map[temp][i] == 1 && map[i][temp] == 1 && !visit[i]) {
pass_queue.push(i);
visit[i] = true;
}
}
cout << pass_queue.front() << " ";
pass_queue.pop();
}
}
'algorithm > BOJ' 카테고리의 다른 글
백준 6603_로또(C++) (0) | 2020.10.23 |
---|---|
백준 16395_파스칼의 삼각형(C++) (0) | 2020.10.23 |
백준 9342_염색체(C++) (2) | 2020.10.20 |
백준 1927_최소 힙(C++) (0) | 2020.10.18 |
백준 11279_최대 힙(C++) (0) | 2020.10.18 |