1260번: DFS와 BFS
첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사
www.acmicpc.net
#include <iostream>
#include <cstring> //memset
#include <queue>
using namespace std;
bool visited[1001] = {false};
int arr[1001][1001];
int n, m, startV;
void dfs(int v){
cout << v << " ";
visited[v] = true;
for(int i=1; i<=n; i++){
if(!visited[i] && arr[v][i]==1){
dfs(i);
}
}
}
void bfs(int v){
queue<int> q;
q.push(v);
visited[v] = true;
while(!q.empty()){
int x = q.front();
cout << x << " ";
q.pop();
for(int i=1; i<=n; i++){
if(!visited[i] && arr[x][i]==1){
visited[i] = true;
q.push(i);
}
}
}
}
int main(){
cin >> n >> m >> startV;
for(int i=0; i<m; i++){
int v1, v2;
cin >> v1 >> v2;
arr[v1][v2] = arr[v2][v1] = 1;
}
dfs(startV);
cout << endl;
memset(visited, false, sizeof(visited)); //visited[] 초기화
bfs(startV);
return 0;
}
DFS : 깊이 우선 탐색
①연결된 점이 있으면 ②그 점과 연결된 또다른 점을 찾는다.
이 두가지를 재귀로 반복하며 찾는다.
BFS : 너비 우선 탐색
①각 정점과 연결된 모든 점을 파악하고, ②그 연결된 점에서 연결된 모든 점을 파악한다.
연결된 모든 점을 큐에 넣고, ①이 끝나면 큐에서 점을 pop해서 ②를 수행한다.
-
memset
- (배열/벡터의 모든값) 초기화 시 사용됨
- 헤더 : <cstring>
- memset(메모리 시작 주소, 초기화값, 변경할 메모리 크기)
- 여기서 초기화 값 = 1Byte 를 의미한다. -> bool형(true/false), char형, 숫자0
- 배열 - memset(배열 이름, 초기화값, sizeof(배열이름))
- 예) memset(arr, flase, sizeof(arr));
- memset(arr, 1, sizeof(arr));
'1d-1c > BOJ' 카테고리의 다른 글
1781_컵라면 (C++) (0) | 2021.06.24 |
---|---|
1149_RGB거리 (C++) (0) | 2020.12.29 |
1932_정수 삼각형 (JAVA) (0) | 2020.12.18 |
14889_스타트와 링크 (JAVA) (0) | 2020.12.15 |
10814_나이순 정렬 (JAVA) (0) | 2020.12.05 |