class Solution { public boolean canFinish(int numCourses, int[][] prerequisites) { int len=prerequisites.length; if(len==0) return true; int[] pre=new int[numCourses]; HashSet<Integer>[] after=new HashSet[numCourses]; for(int i=0;i<numCourses;i++){ after[i]=new HashSet<>(); } for(int[] p:prerequisites){ pre[p[0]]++; after[p[1]].add(p[0]); } int count=0; LinkedList<Integer> queue=new LinkedList<>(); for(int i=0;i<numCourses;i++){ if(pre[i]==0){ queue.offer(i); } } while(!queue.isEmpty()){ int finished=queue.poll(); count++; for(int i:after[finished]){ pre[i]--; if(pre[i]==0){ queue.offer(i); } } } return count==numCourses; }}