풀이
위상정렬을 하자!
코드
#include <stdio.h>
#include <memory.h>
const int n_ = 100000 + 1;
int ans, a[n_], idg[n_];
bool chk[n_];
void dfs(int n) {
chk[n] = true;
++ans, --idg[a[n]];
if (!chk[a[n]] && !idg[a[n]]) dfs(a[n]);
}
int main() {
int t, n, i, j;
scanf("%d", &t);
for (i = 1; i <= t; ++i) {
ans = 0;
scanf("%d", &n);
memset(chk, 0, sizeof(chk));
memset(idg, 0, sizeof(idg));
for (j = 1; j <= n; ++j) {
scanf("%d", &a[j]);
++idg[a[j]];
}
for (j = 1; j <= n; ++j) if (!chk[j] && !idg[j])
dfs(j);
printf("%d\n", ans);
}
return 0;
}
아무말
백준, 백준 온라인 저지, BOJ, Baekjoon Online Judge, C, C++, 씨, 씨쁠쁠, JAVA, algorithm, 자바, 알고리즘, 자료구조, 문제, 문제 풀이, 풀이