Question 3 Parallel Course

题目问我们最少需要几个学期去上课:

  • 为什么不把课都一个学期上,因为你和你的前置课程不能在同一学习

所以怎么上课最快?所以怎么上课最慢?

  • 同样优先级的可一定要一个学期上就比较快

  • 最慢怎么上?明明可以一起上的课,一个一个来chain

这题本质是对拓扑图的按层遍历

public int minimumSemesters(int n, int[][] relations) {
    Map<Integer, List<Integer>> graph = new HashMap<>();
    int[] inDegree = new int[n + 1];
    /*
        relations[i] = [preCourse, nextCourse]
        relation[i][0] first relations[i][1] second relation
        relaiton[i][0] --> relation[i][1] index 0 里面加1,1的入度++
    */ 
    for (int[] relation: relations) {
        inDegree[relation[1]]++;
        graph.putIfAbsent(relation[0], new ArrayList<>());
        graph.get(relation[0]).add(relation[1]);
    }
    
    Deque<Integer> queue = new ArrayDeque<>();
    // step 1: generate all indegree 0 nodes
    for (int i = 1; i <= n; i++) {
        if (inDegree[i] == 0) {
            queue.offer(i);
        }
    }
    int semester = 0;
    int count = 0;
    
    // step 2: BFS topological process
    while (!queue.isEmpty()) {
        int size = queue.size();
        for (int i = 0; i < size; i++) {
            Integer cur = queue.poll();
            count++;
            for (Integer nei: graph.getOrDefault(cur, new ArrayList<>())) {
                inDegree[nei]--;
                if (inDegree[nei] == 0) {
                    queue.offer(nei);
                }
            }
        }
        semester++;
    }
    if (count != n) {
        return -1;
    }
    return semester;
}

Last updated