public static boolean canFinish(int numCourses,int[][] pre){
int[] indegrees = new int[numCourses];
List<ArrayList<Integer>> adja = new ArrayList<>();
for (int i = 0; i <numCourses ; i++) {
adja.add(new ArrayList<>());
}
for(int[] p :pre){
indegrees[p[0]]++;
adja.get(p[1]).add(p[0]);
}
LinkedList<Integer> queue = new LinkedList<>();
for (int i = 0; i <numCourses ; i++) {
if(indegrees[i]==0){
queue.add(i);
}
}
while (!queue.isEmpty()){
Integer poll = queue.poll();
numCourses--;
for(Integer ad:adja.get(poll)){
indegrees[ad]--;
if(indegrees[ad]==0){
queue.add(ad);
}
}
}
return numCourses==0;
}