58 lines
928 B
C
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;
|
|
} |