拓扑排序的作用:将有向图的顶点排成一个线性序列
拓扑排序主要用来解决有向图中的依赖解析(dependency resolution)问题
主要的思路就是找到入度为0的结点。去除。将他的连着的子结点的入度都减一。然后重复这个过程。就得到了拓扑排序。
public class Solution {
public boolean canFinish(int numCourses, int[][] prerequisites) {
// 拓扑排序的一道题目
// 拓扑排序主要用来解决有向图中的依赖解析(dependency resolution)问题
int[] indegree = new int[numCourses]; // 用来记录各个结点的入度。
List<List<Integer>> list = new LinkedList<>();// 用来记录,每个结点,指向的结点。
for (int i = 0; i < numCourses; i++) {
list.add(new LinkedList<>());
}
for (int[] prerequisite : prerequisites) {
indegree[prerequisite[0]]++;
list.get(prerequisite[1]).add(prerequisite[0]);
}
Queue<Integer> queue = new LinkedList<>();
for (int i = 0; i < numCourses; i++) {
if (indegree[i] == 0) {
queue.add(i);
}
}
while (!queue.isEmpty()) {
int remove = queue.remove();
numCourses --;
for (int integer : list.get(remove)) {
indegree[integer]--;
if (indegree[integer] == 0) {
queue.add(integer);
}
}
}
return numCourses == 0;// 如果最后 numCourses 减到0了,说明,能够学完这些课程。
}
}