깊이우선탐색(DFS)
백준 10451번: 순열 사이클
cepiloth
2018. 6. 24. 13:58
반응형
https://www.acmicpc.net/problem/10451
1. 문제
1부터 N까지 정수 N개로 이루어진 순열을 나타내는 방법은 여러가지가 있다. 예를 들어, 8개의 수로 이루어진 순열 (3, 2, 7, 8, 1, 4, 5, 6)을 배열을 이용해 표현하면 와 같다. 또는, Figure 1과 같이 방향 그래프로 나타낼 수도 있다.
순열을 배열을 이용해 로 나타냈다면, 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, 0, sizeof(visited)); memset(board, 0, sizeof(board)); } return 0; } | cs |
반응형