Topological Sort

General Rules:

  • 处理依赖关系(Pre-requisties)时,首先计算出每个元素的入度(indegree),其次用一个 Queue 来存储当前入度为0的元素(即无依赖),然后依次去处理各个元素的依赖关系,更新入度,并更新Queue,直到Queue里无元素。

  • 处理任务调度(Task Scheduling)。

经典题目

207 Course Schedule 210 Course Schedule II

入度可以看成是每门课依赖于多少门别的课,这样入度为0的课就是无依赖的课,可以直接加进Queue里。随后,将Queue里的元素一个一个取出,此时可以将以该门课为依赖的所有课入度减一,并将新的入度为0的课加进Queue里,直至Queue里无元素。在整个过程中,我们可以计算从Queue里取出了多少个元素,若与numCourses相等,即能完成所有课程。

public boolean canFinish(int numCourses, int[][] prerequisites) {
    int[] indegrees = new int[numCourses];
    for (int[] pair: prerequisites) {
        indegrees[pair[0]]++;
    }
    Deque<Integer> queue = new LinkedList<>();
    for (int i = 0; i < indegrees.length; i++) {
        if (indegrees[i] == 0) {
            queue.add(i);
        }
    }
    int select = 0;
    while (!queue.isEmpty()) {
        int cur = queue.pollFirst();
        select += 1;
        for (int[] pair : prerequisites) {
            if (pair[1] == cur) {
                indegrees[pair[0]]--;
                if (indegrees[pair[0]] == 0) {
                    queue.add(pair[0]);
                }
            }
        }
    }
    return select == numCourses;
}

Last updated