ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준] #1260번: DFS와 BFS
    Programming/백준 (c++) 2022. 3. 28. 23:35

    https://www.acmicpc.net/problem/1260

    문제

    그래프를 DFS로 탐색한 결과와 BFS로 탐색한 결과를 출력하는 프로그램을 작성하시오. 단, 방문할 수 있는 정점이 여러 개인 경우에는 정점 번호가 작은 것을 먼저 방문하고, 더 이상 방문할 수 있는 점이 없는 경우 종료한다. 정점 번호는 1번부터 N번까지이다.

    입력

    첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사이에 여러 개의 간선이 있을 수 있다. 입력으로 주어지는 간선은 양방향이다.

    출력

    첫째 줄에 DFS를 수행한 결과를, 그 다음 줄에는 BFS를 수행한 결과를 출력한다. V부터 방문된 점을 순서대로 출력하면 된다.

    예제 입력 1 

    4 5 1
    1 2
    1 3
    1 4
    2 4
    3 4
    

    예제 출력 1 

    1 2 4 3
    1 2 3 4
    

    예제 입력 2 

    5 5 3
    5 4
    5 2
    1 2
    3 4
    3 1
    

    예제 출력 2 

    3 1 2 5 4
    3 1 4 2 5

    코드 

    cpp

    #include <iostream>
    #include <queue>
    
    using namespace std;
    
    #define MAX 1001
    
    int N, M, V; //정점개수, 간선개수, 시작정점
    int map[MAX][MAX]; //인접 행렬 그래프
    bool visited[MAX]; //정점 방문 여부
    queue<int> q;
    
    void reset() {
        for (int i = 1; i <= N; i++) {
            visited[i] = 0;
        }
    }
    
    void DFS(int v) {
        visited[v] = true;
        cout << v << " ";
    
        for (int i = 1; i <= N; i++) {
            if (map[v][i] == 1 && visited[i] == 0) { //현재 정점과 연결되어있고 방문되지 않았으면
                DFS(i);
            }
        }
    }
    
    void BFS(int v) {
        q.push(v);
        visited[v] = true;
        cout << v << " ";
    
        while (!q.empty()) {
            v = q.front();
            q.pop();
    
            for (int w = 1; w <= N; w++) {
                if (map[v][w] == 1 && visited[w] == 0) { //현재 정점과 연결되어있고 방문되지 않았으면
                    q.push(w);
                    visited[w] = true;
                    cout << w << " ";
                }
            }
        }
    }
    
    int main() {
        cin >> N >> M >> V;
    
        for (int i = 0; i < M; i++) {
            int a, b;
            cin >> a >> b;
            map[a][b] = 1; // 정점 a와 b가 연결되어있음 (인접행렬)
            map[b][a] = 1;
        }
    
        reset();
        DFS(V);
    
        cout << '\n';
    
        reset();
        BFS(V);
    
        return 0;
    }

    ⓐ 인접행렬 map[][]을 통해 입력받은 정점a,b가 간선으로 연결되어있음을 map[a][b]=1 로 작성

    ⓑ reset() 함수를 통해 각 노드의 방문상태를 초기화

    ⓒ DFS 함수 

    → 우선 DFS함수에 인자로 넘겨받은 숫자의 노드는 방문처리를 한다.

    → 방문처리를 한 숫자를 출력 (방문된 점을 순서대로 출력하는 것이기 때문에)

    → 그 노드와 연결되어있는 노드 중 방문되지 않은 노드가 있다면 그 노드를 DFS함수의 인자로 다시 넘겨준다

    ⓓ BFS 함수

    → queue를 이용한다

    → 처음 시작 노드를 queue에 삽입하고 방문처리

    → 방문처리를 한 숫자를 출력

    →  queue가 비어있지않다면 맨 앞에있는(이미 방문처리를 한) 노드는 삭제하고 연결된 노드 중 방문처리가 되지 않은 노드를 출력한다

     

    **

    DFS는 스택 자료구조를 이용해 재귀적으로 구현하지만 BFS는 큐를 이용한다는 차이가있다

     

Designed by Tistory.