알고리즘
[C++] 백준 2668번 숫자고르기
J3SUNG
2019. 8. 19. 18:57
728x90
DFS, BFS문제입니다.
싸이클이 돌아서 다시 시작했던 숫자로 돌아올 수 있는 정수들을 구하는 문제입니다.
DFS를 통해서 각 숫자들을 전부 탐색하며
탐색하다가 시작했던 숫자로 돌아오면 그 숫자를 체크합니다.
체크한 숫자의 개수와, 숫자들을 출력하여 문제를 풀었습니다.
#include <iostream>
#include <cstring>
using namespace std;
int n;
int countNum;
int flag;
int map[110][110];
int visit[110];
int arr[110];
void DFS(int a, int b, int x)
{
if (flag == 1) {
return;
}
if (b == x && visit[x] == 1) {
arr[x] = x;
flag = 1;
++countNum;
return;
}
visit[b] = 1;
for (int j = 1; j <= n && flag == 0; ++j) {
if (map[b][j] == 1 && (j == x || visit[j] == 0)) {
DFS(b, j, x);
}
}
}
int main(int argc, char *argv[])
{
countNum = 0;
cin >> n;
memset(map, 0, sizeof(map));
memset(arr, 0, sizeof(arr));
for (int i = 1; i <= n; ++i) {
int a;
cin >> a;
map[i][a] = 1;
}
for (int i = 1; i <= n; ++i) {
flag = 0;
memset(visit, 0, sizeof(visit));
DFS(0, i, i);
}
cout << countNum << endl;
for (int i = 0; i <= n; ++i) {
if (arr[i] != 0) {
cout << arr[i] << endl;
}
}
return 0;
}