BOJ

백준 10451 - 순열 사이클

yanJuicy 2019. 7. 11. 09:35
반응형

문제

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

 

10451번: 순열 사이클

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

www.acmicpc.net

 

풀이

사이클을 이루는 그래프의 컴포넌트 수를 구하면 된다. 1번 정점부터 N번 정점까지 돌면서 dfs 탐색을 실행할 때 마다 컴포넌트 수를 추가해 준다. 그리고 각 정점은 한 개의 간선만 가지므로 1차원 배열로 그래프를 표현할 수 있다. 

 

 

코드

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
#include <iostream>
 
using namespace std;
 
int graph[1001];
bool visit[1001];
int T, N;
int cnt;
 
void dfs(int v)
{
    visit[v] = true;
 
    if (!visit[graph[v]]) dfs(graph[v]);
}
 
int main()
{
    cin.tie(0);
    ios::sync_with_stdio(false);
 
    cin >> T;
    while (T--)
    {
        cnt = 0;
        cin >> N;
        for (int i = 1; i <= N; i++)
        {
            visit[i] = false;
            cin >> graph[i];
        }
        for (int i = 1; i <= N; i++)
        {
            if (!visit[i]) 
            { 
                dfs(i);
                cnt++;
            }
        }
        cout << cnt << '\n';
    }
 
    return 0;
}
 
cs
반응형

'BOJ' 카테고리의 다른 글

백준 11053 - 가장 긴 증가하는 부분 수열  (0) 2019.07.14
백준 2156 - 포도주 시식  (0) 2019.07.12
백준 1707 - 이분 그래프  (0) 2019.07.10
백준 11057 - 오르막 수  (0) 2019.07.08
백준 10844 - 쉬운 계단 수  (0) 2019.07.07