拓扑排序是将有向无环图中的顶点进行排序,排序后,顶点按照总入度递增排序,即入度最少的顶点排在最前面。
该算法在实际应用中常用于确定一个依赖关系集中,各种互相依赖事件的发生顺序。再本题中就是不同课程的先修顺序。
将课程想象为图的节点,那么课程间的依赖关系便是构成图的边,使用拓扑排序便能确定(其中一种)选课顺序了。
class Solution {
public boolean canFinish(int numCourses, int[][] prerequisites) {
int[] indegrees = new int[numCourses];
List<List<Integer>> adjacency = new ArrayList<>();
for(int i = 0; i < numCourses; i++){
adjacency.add(new ArrayList<>());
}
//统计每个顶点的入度
for(int[] i : prerequisites){
indegrees[i[0]]++;
adjacency.get(i[1]).add(i[0]);
}
Queue<Integer> q = new LinkedList<>();
for(int i=0; i<numCourses; i++){
if(indegrees [i] == 0){
q.offer(i);
}
}
while(!q.isEmpty()){
int temp = q.poll();
numCourses--;
for(int cur : adjacency.get(temp)){
if(--indegrees[cur] == 0) q.add(cur);
}
}
return numCourses == 0;
}
}