예제 문제: 텀 프로젝트_백준
source: https://www.acmicpc.net/problem/9466


풀이
#include <iostream>
#include <vector>
#include <map>
using namespace std;
int T, N;
int DFS_checkCycle(int node, vector<bool>& visited, map<int, int>& group, int groupMemberCnt, const vector<int>& Want) {
int nextNode = Want[node];
if(group.find(nextNode) != group.end()) {
return groupMemberCnt - (groupMemberCnt - group[nextNode]);
}
else if (visited[nextNode]) {
return groupMemberCnt;
}
visited[nextNode] = true;
group.insert({nextNode, groupMemberCnt});
return DFS_checkCycle(nextNode, visited, group, groupMemberCnt + 1, Want);
}
int solution(const vector<int>& Want) {
int cnt = 0;
vector<bool> visited(N + 1, false);
for (int i = 1; i <= N; i++) {
int node = i;
if (visited[node])
continue;
map<int, int> group;
group.insert({ node, 0 });
visited[node] = true;
int groupMemberCnt = 1;
int noneGroupMember = DFS_checkCycle(node, visited, group, groupMemberCnt, Want);
cnt += noneGroupMember;
}
return cnt;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> T;
vector<int> answers(T);
for (int t = 0; t < T; t++) {
cin >> N;
vector<int> Want(N + 1);
for (int i = 1; i <= N; i++) {
int want;
cin >> want;
Want[i] = want;
}
answers[t] = solution(Want);
}
for (int i = 0; i < T; i++) {
cout << answers[i] << '\n';
}
}