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는 큐를 이용해 구현했다.
코드
#include <vector>
#include <algorithm>
#include <iostream>
#include <queue>
using namespace std;
#define SIZE 1001
vector<int> dfs[SIZE];
vector<int> bfs[SIZE];
int isVisited[SIZE] = {0,};
void DFS(int V){
if(isVisited[V] == true) return;
isVisited[V] = true; //방문 완료
cout << V << " ";
for(int i=0;i<dfs[V].size();i++){
DFS(dfs[V][i]);
}
}
queue<int> bfs_queue;
void BFS(int V){
bfs_queue.push(V);
while(!bfs_queue.empty()){
int next = bfs_queue.front();
bfs_queue.pop();
if(isVisited[next] == true) continue;
isVisited[next] = true;
cout << next << " ";
for(int i=0;i<bfs[next].size();i++){
bfs_queue.push(bfs[next][i]);
}
}
}
int main(int argc, const char *argv[])
{
int N,M,V;
int a,b;
cin >> N >> M >> V;
for(int i=0;i<M;i++){
cin >> a >> b;
dfs[a].push_back(b);
dfs[b].push_back(a);
bfs[a].push_back(b);
bfs[b].push_back(a);
}
//정점 번호가 작은것부터 방문 -> 오름차순 정렬
for(int i=0;i<=N;i++) sort(dfs[i].begin(), dfs[i].end());
DFS(V);
cout << "\n";
fill_n(isVisited, SIZE, false); //초기화
for(int i=0;i<=N;i++) sort(bfs[i].begin(), bfs[i].end());
BFS(V);
return 0;
}
'코딩테스트 연습 > Baekjoon' 카테고리의 다른 글
[Baekjoon] 1593번: 문자 해독(c++) (0) | 2022.02.18 |
---|---|
[Baekjoon]20413번: MVP 다이아몬드 (easy)(c++) (0) | 2022.02.14 |
[Baekjoon]10757번: 큰 수 A+B (c++) (0) | 2022.02.14 |
[Baekjoon]7576번 - 토마토 (0) | 2022.01.18 |
[Baekjoon] 2589번 보물섬 (0) | 2022.01.17 |