1136. Parallel Courses

7 阅读1分钟

image.png

image.png

Solution BFS

image.png

class Solution {
    public int minimumSemesters(int n, int[][] relations) {
        int[] inDegree = new int[n + 1];
        Map<Integer, List<Integer>> graph = new HashMap<>();
        for (int i = 1; i <= n; i++) {
            graph.put(i, new ArrayList<>());
        }

        for (int[] r : relations) {
            inDegree[r[1]]++;
            graph.get(r[0]).add(r[1]);
        }

        // Queue for courses that can be taken (i.e., in-degree is 0)
        Queue<Integer> queue = new LinkedList<>();
        for (int i = 1; i <= n; i++) {
            if (inDegree[i] == 0) {
                queue.offer(i);
            }
        }

        int count = 0;
        int res = 0;
        while (!queue.isEmpty()) {
            int size = queue.size(); // Courses to take this semester
            for (int i = 0; i < size; i++) {
                int curCourse = queue.poll();
                count++; // to calculate count==n, if these is a loop

                for (int adj : graph.get(curCourse)) {
                    inDegree[adj]--;
                    if (inDegree[adj] == 0) {
                        queue.offer(adj); // Can be taken in the next semester
                    }
                }

            }

            res++;
        }
        return count == n ? res : -1;
    }
}