728x90
사이클을 확인하는 문제입니다.
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 |