class Solution {
// 保存每个点的入度列表和出度列表
// 从所有入度为0的点开始遍历,如果最终能够遍历到所有点,那么可以
private int cnt;
private boolean[] vis;
private void helper(int cur,int start){
if(start!=cur){
inDegree[cur]--;
}
vis[cur]=true;
cnt++;
for(int i:out.getOrDefault(cur,new ArrayList<>())){
inDegree[i]--;
if(inDegree[i]==0&&!vis[i]){
helper(i,cur);
}
}
}
private HashMap<Integer,List<Integer>> out=new HashMap<>();
private int[] inDegree;
public boolean canFinish(int numCourses, int[][] prerequisites) {
// 还要维护每个点的入度,当一个指向该点的点被遍历,那么该点的入度--
inDegree=new int[numCourses];
vis=new boolean[numCourses];
for(int[] a:prerequisites){
// a[0]是终点,a[1]是起点
List<Integer> tOut=out.getOrDefault(a[1],new ArrayList<>());
tOut.add(a[0]);
out.put(a[1],tOut);
inDegree[a[0]]++;
}
for(int i=0;i<numCourses;i++){
if(inDegree[i]==0&&!vis[i]){
helper(i,i);
}
}
return cnt==numCourses;
}
}