알고리즘

[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;
}