SW
[백준 10451] 순열 사이클 본문
0. 제목
- 백준 10451 순열 사이클
- BOJ 10451 순열 사이클
- C++ 10451 순열 사이클
1. 문제
https://www.acmicpc.net/problem/10451
2. 풀이
- DFS, BFS 두가지 방법으로 풀 수 있다.
- Directed Graph 이므로 방향성을 가지고 있다.
- 각 정점에 연결된 점들을 graph vector에 push_back 함으로써 연결성을 가지게 한다.
- 그 후 DFS, BFS 중 하나를 이용하여 탐색을하고 모든 점을 시작점으로 하여 count 값을 구한다.
- count 값이 순열 사이클의 개수이다.
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
|
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
vector<int> graph[1001];
int arr[1001];
int visited[1001] = {0};
void dfs(int x);
void bfs(int start);
int main(int argc, const char * argv[]) {
int T, N;
int count;
cin >> T;
for(int i = 0; i < T; i++){
count = 0;
cin >> N;
for(int j = 1; j <= N; j++)
graph[j].clear();
memset(visited, 0, sizeof(visited));
for(int j = 1; j <= N; j++){
cin >> arr[j];
graph[j].push_back(arr[j]);
}
for(int j = 1; j <= N; j++){
if(!visited[j]){
dfs(j);
count++;
}
}
cout << count << '\n';
}
return 0;
}
void dfs(int x){
if(visited[x]) return;
visited[x] = true;
unsigned long int size = graph[x].size();
for(int i = 0; i < size; i++){
int y = graph[x][i];
dfs(y);
}
}
|
'대학교 > Algorithm' 카테고리의 다른 글
[백준 2331] 반복수열 (0) | 2020.02.07 |
---|---|
[백준 11047] 동전 0 (0) | 2020.02.05 |
[백준 1912] 연속합 (0) | 2020.02.01 |
[백준 1707] 이분 그래프 (0) | 2020.02.01 |
[백준 11724] 연결 요소의 개수 (0) | 2020.01.29 |
Comments