끄적끄적 코딩
article thumbnail

사이클을 확인하는 문제입니다.

DFS를 통해서 각 노드에서 이어진 노드를 전부 방문처리를 해주었습니다.
이어진 노드끼리는 방문처리 과정에서 같은 노드라고 체크해주었습니다.
ex) 1, 3, 4 싸이클,     2, 5 싸이클
visit[1] = 1
visit[3] = 1
visit[4] = 1

visit[2] = 2
visit[5] = 2

위와 같이 각 싸이클에 해당 넘버를 지정해서 체크해주고
최종적으로 넘버를 통해서 싸이클이 몇개인지 확인했습니다.

 

#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;

int ts;
int n;
int num;
int c = 1;
int cycle;
int visit[1010];
vector<vector<int> > v;

int DFS(int cur)
{
	int r = 1;
	for (int i = 0; i < v[cur].size(); ++i) {
		if (visit[cur] == 0) {
			visit[cur] = c;
			r = min(r, DFS(v[cur][i]));
		}
		else if (visit[cur] == c) {
			return 1;
		}
		else {
			return -1;
		}
	}
	return r;
}

int main(int argc, char* argv[])
{
	cin >> ts;

	while (ts--) {
		cin >> n;

		c = 1;
		v.clear();
		v.resize(n + 1);
		memset(visit, 0, sizeof(visit));
		
		for (int i = 1; i <= n; ++i) {
			cin >> num;
			v[i].push_back(num);
		}

		for (int i = 1; i < n + 1; ++i) {
			cycle = 0;
			if (visit[i] == 0) {
				cycle = max(cycle, DFS(i));
			}
			c += cycle;
		}

		cout << c - 1 << endl;
	}

	return 0;
}

'알고리즘' 카테고리의 다른 글

[C++] 백준 2523번 별 찍기 - 13  (2) 2019.10.01
[C++] 백준 2522번 별 찍기 - 12  (2) 2019.10.01
[C++] 백준 10699번 오늘 날짜  (0) 2019.09.28
[C++] 백준 1547번 공  (0) 2019.09.28
[C++] 백준 16360번 Go Latin  (0) 2019.09.27

검색 태그