207. 课程表
作者:互联网
class Solution {
//建图,bfs
public boolean canFinish(int numCourses, int[][] prerequisites) {
if(prerequisites.length==0)return true;
int[] inDegree=new int[numCourses];//节点的入度记录
HashSet<Integer>[] adj=new HashSet[numCourses];//边数组,每个节点的边关 系用一个HashSet来记录
for(int i=0;i<numCourses;i++)
adj[i]=new HashSet<>();
//边的关系是prerequisites给出的
for(int i=0;i<prerequisites.length;i++){
inDegree[prerequisites[i][0]]++;//第一个节点的入度+1
adj[prerequisites[i][1]].add(prerequisites[i][0]);//记录边关系,这是有向边哦
}
//至此,建图完毕
LinkedList<Integer> que=new LinkedList<>();//bfs遍历用的队列,入队列的都是入度为0的节点
//把入度为0的节点加入队
for(int i=0;i<numCourses;i++){
if(inDegree[i]==0)
{
que.add(i);
}
}
int cnt=0;
while(!que.isEmpty()){
int now=que.removeLast();
cnt++;
//把他指向的节点的入度都-1
//语法糖,for each遍历集合
for(int elem: adj[now]){
inDegree[elem]--;
if(inDegree[elem]==0)
que.add(elem);
}
}
return cnt==numCourses;
}
}
标签:207,HashSet,int,入度,numCourses,课程表,new,节点 来源: https://www.cnblogs.com/wsshub/p/15387462.html