반응형
문제
풀이
각각의 정점에서 dfs를 실행하면서, 다른 루프와 겹치는지 검사합니다.
겹치지 않았다면 cnt를 늘려주고 check 표시를 합니다.
이후 check된 노드들을 표시합니다.
소스 코드
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
|
#include <iostream>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
int graph[101];
bool visited[101];
bool check[101];
vector<int> v;
int cnt;
int maxcnt;
void dfs(int start, int node) {
visited[node] = true;
int next = graph[node];
cnt++;
v.push_back(node);
// 시작 지점으로 돌아오면 중복 검사
if (next == start) {
bool overlap = false;
// 중복 검사
for (int i = 0; i < v.size(); i++) {
if (check[v[i]] == true) {
overlap = true;
break;
}
}
// 다른 부분과 중복되지 않으면 check 해주기
if (!overlap) {
for (int i = 0; i < v.size(); i++) {
check[v[i]] = true;
}
maxcnt += cnt;
}
}
// 다른 방문한 노드로 가는 경우에는 return
else if (visited[next])
return;
// 방문하지 않았으면 dfs 재귀 호출
else {
dfs(start, next);
}
}
int main() {
// 입력
int N;
cin >> N;
for (int i = 1; i <= N; i++) {
cin >> graph[i];
}
// dfs
for (int i = 1; i <= N; i++) {
cnt = 0;
memset(visited, 0, sizeof(visited));
v.clear();
dfs(i, i);
}
cout << maxcnt << '\n';
// check 된 것들 출력
for (int i = 1; i <= N; i++) {
if (check[i])
cout << i << '\n';
}
return 0;
}
|
cs |
반응형
'알고리즘 > 백준' 카테고리의 다른 글
[백준 6593] 상범 빌딩 C++ (0) | 2021.10.01 |
---|---|
[백준 17471] 게리맨더링 C++ (0) | 2021.09.29 |
[백준 9084] 동전 (C++) (0) | 2021.09.27 |
[백준 2981] 검문 C++ (0) | 2021.09.26 |
[백준 14226] 이모티콘 C++ (0) | 2021.09.26 |