ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 10451번: 순열 사이클
    깊이우선탐색(DFS) 2018. 6. 24. 13:58
    반응형

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


    1. 문제

    1부터 N까지 정수 N개로 이루어진 순열을 나타내는 방법은 여러가지가 있다. 예를 들어, 8개의 수로 이루어진 순열 (3, 2, 7, 8, 1, 4, 5, 6)을 배열을 이용해 표현하면 (1234567832781456) 와 같다. 또는, Figure 1과 같이 방향 그래프로 나타낼 수도 있다.

    순열을 배열을 이용해 (1inπ1πiπn) 로 나타냈다면, i에서 πi로 간선을 이어 그래프로 만들 수 있다.

    Figure 1에 나와있는 것 처럼, 순열 그래프 (3, 2, 7, 8, 1, 4, 5, 6) 에는 총 3개의 사이클이 있다. 이러한 사이클을 "순열 사이클" 이라고 한다.

    N개의 정수로 이루어진 순열이 주어졌을 때, 순열 사이클의 개수를 구하는 프로그램을 작성하시오.


    2. 알고리즘

    키워드 - DFS, BFS


    3. 코드

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    #include <iostream>
    #include <sstream>
    #include <string>
    #include <algorithm>
    #include <functional>
    #include <vector>
    #include <list>
    #include <queue>
    #include <deque>
    #include <map>
    #include <set>
    #include <stack>
    #include <cstring>
    using namespace std;
     
    #define MAX_SIZE 100
    #define INF 0x7fffffff
     
    int board[1001];
    int visited[1001];
     
    void dfs(int i) {
     
        if (visited[i]) {
            return;
        }
     
        visited[i] = 1;
     
        dfs(board[i]);
    }
     
    /*
    * @memory  - 1996 kb
    * @time    - 36 ms
    */
    int main() {
     
        std::ios::sync_with_stdio(false); cin.tie(0);
     
        int n; cin >> n;
     
        while(n--) {
            int d; cin >> d;
            
            for(int i=1; i<=d; i++) {
                cin >> board[i];
                visited[i] = 0;
            }
     
            int sol = 0;
            for(int i=1; i<=d; i++) {
                
                if (visited[i] == 0) {
                    dfs(i);
                    sol++;
                }
            }
     
            cout << sol << "\n";
     
            memset(visited, 0sizeof(visited));
            memset(board, 0sizeof(board));
        }
        return 0;
    }
     
    cs

    반응형

    '깊이우선탐색(DFS)' 카테고리의 다른 글

    백준 2606번: 바이러스  (0) 2018.07.01
    백준 2573번: 빙산  (0) 2018.07.01
    백준 2468번: 안전 영역  (0) 2018.06.23
    백준 11724번: 연결 요소의 개수  (0) 2018.06.23
    백준 1012번: 유기농 배추(DFS)  (0) 2018.06.23

    댓글

Designed by Tistory.