https://www.acmicpc.net/problem/9466
방향 그래프 사이클 찾기
DFS
import java.io.*;
import java.util.StringTokenizer;
public class Main {
// input
private static BufferedReader br;
// variables
private static final int MAX = 100_001;
private static int N, ret;
private static boolean[] isVisited, finished;
private static int[] arr = new int[MAX];
public static void main(String[] args) throws IOException {
br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int t = Integer.parseInt(br.readLine());
while (t-- > 0) {
input();
bw.write(solve());
}
bw.close();
} // End of main()
private static String solve() {
StringBuilder sb = new StringBuilder();
isVisited = new boolean[N + 1];
finished = new boolean[N + 1];
ret = 0;
// 팀에 속하지 못한 학생의 수를 출력하기
for (int i = 1; i <= N; i++) {
if (isVisited[i]) continue;
DFS(i);
}
sb.append(N - ret).append('\n');
return sb.toString();
} // End of solve()
private static void DFS(int node) {
isVisited[node] = true;
int next = arr[node];
if (!isVisited[next]) {
DFS(next);
} else if (!finished[next]) {
int count = 1;
for (int i = next; i != node; i = arr[i]) {
count++;
}
ret += count;
}
finished[node] = true;
} // End of DFS()
private static void input() throws IOException {
N = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
arr[i + 1] = Integer.parseInt(st.nextToken());
}
} // End of input()
} // End of Main class