smooth waters run deep

1d-1c/BOJ

1260_DFS와 BFS (C++)

yeon_11 2020. 12. 22. 00:48
 

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