BOJ 9466: 텀 프로젝트 작성일 2020-03-04 https://www.acmicpc.net/problem/9466 3월동안 210문제 풀기 (10/210) 위상정렬로 사이클 찾기, DFS로도 당연히 가능 (BackEdge 찾으면 됨) 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051#include <bits/stdc++.h> using namespace std; struct Graph { int N; vector<vector<int>> adj; vector<int> indegree; Graph(int n): N(n), adj(n+1), indegree(n+1) {} void addEdge(int u, int v) { adj[u].push_back(v); indegree[v]++; } int topologicalSort() { queue<int> q; for(int i = 1; i <= N; i++) if(indegree[i] == 0) q.push(i); int cnt = 0; while(q.size()) { int u = q.front(); q.pop(); cnt++; for(int v: adj[u]) { if(--indegree[v] == 0) q.push(v); } } return cnt; } }; int main() { int TC, N, v; scanf("%d", &TC); while(TC--) { scanf("%d", &N); Graph graph(N); for(int u = 1; u <= N; u++) { scanf("%d", &v); graph.addEdge(u, v); } int cnt = graph.topologicalSort(); printf("%d\n", cnt); } }