c++ 백준 문제 풀이
[백준/C++][순열 사이클(10451번)]
산기대 컴공
2020. 12. 2. 19:56
728x90
문제
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
www.acmicpc.net
문제 풀이
1. 입력값이 주어지면 무방향 인접 리스트를 이용하여 데이터를 저장한다.
2. 인접 리스트를 모른다면 나의 블로그의 인접 리스트 포스팅을 보고 와야 한다.
3. 인접 리스트로 저장 후 DFS알고리즘을 통해 노드 1~N까지 DFS알고리즘을 돌려준다.
4. 여기서 포인트는 visit 배열과 visited 배열 두 개가 있다는 것이다.
5. visit배열은 DFS의 사용하고 visited는 사이클을 구하는 배열이다.
6. 마지막으로 결괏값을 구하고 다음 케이스로 가기 전에 반드시 초기화를 해야 한다.
코드
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 | #include <iostream> #include <vector> #include <cstring> using namespace std; int T,N,cnt = 0; bool visit[1001] = {false}; bool visited[1001] = {false}; vector <int> adj[1001]; void DFS(int node){ visit[node] = true; visited[node] = true; for(int i = 0;i<adj[node].size();i++){ int next_node = adj[node][i]; if(visit[next_node]){continue;} DFS(next_node); } } int main(void){ cin >> T; for(int i = 0;i<T;i++){ cin >> N; for(int j = 1;j<=N;j++){ int a; cin >> a; adj[a].push_back(j); adj[j].push_back(a); } for(int k = 1;k<=N;k++){ memset(visit,false,sizeof(visit)); if(visited[k]){continue;} else{DFS(k);cnt++;visited[k] = true;} } memset(visited,false,sizeof(visited)); cout << cnt << "\n"; cnt = 0; for(int l = 0;l<=N;l++){adj[l].clear();} } } | cs |
728x90