2026-02-15 22:26:08 +09:00

58 lines
928 B
C

#include <stdio.h>
#include <stdbool.h>
int T, N, G;
int select[100001], result[100001];
bool visited[100001], done[100001];
int solv();
void dfs(int num);
int main() {
scanf("%d", &T);
for(int t=0; t<T; t++) {
G = 0;
result[t] = solv();
}
for(int i=0; i<T; i++) printf("%d\n", result[i]);
return 0;
}
int solv() {
scanf("%d", &N);
for(int i=1; i<=N; i++) {
visited[i] = false;
done[i] = false;
scanf("%d", &select[i]);
}
for(int n=1; n<=N; n++) {
dfs(select[n]);
}
return N - G;
}
void dfs(int num) {
if(done[num]) return;
visited[num] = true;
int next = select[num];
if(!visited[next]) dfs(next);
else if(visited[next] && !done[next]) {
int temp = 1;
while(next != num) {
temp++;
next = select[next];
}
G += temp;
}
done[num] = true;
}