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;
}
}