**

**

****

class Solution {
public boolean canFinish(int n, int[][] p) {
Map<Integer,List<Integer>> edges = new HashMap<>();
int[] in = new int[n];//统计每个顶点入度数
//建图
for(int i = 0; i < p.length; i++){
int a = p[i][0], b = p[i][1]; //指向: b -> a
if(!edges.containsKey(b)){
edges.put(b,new ArrayList<>());
}
edges.get(b).add(a);
in[a]++;
}
Queue<Integer> q = new LinkedList<>();
//进行拓扑排序: 先把入度为0的节点加入队列
for(int i = 0; i < n; i++){
if(in[i] == 0) q.offer(i);
}
while(!q.isEmpty()){
int t = q.poll();
//可能会指向空的
for(int x : edges.getOrDefault(t, new ArrayList<>())){
//删除节点指向的边
in[x]--;
if(in[x] == 0) q.offer(x);
}
}
//判断是否有环
for(int pos : in){
if(pos != 0) return false;
}
return true;
}
}