拓扑排序(课程顺序113)

拓扑排序

1. 拓扑排序的定义

拓扑排序:无环,含有依赖的有向图

算法实现:

    1. 统计每个点的入度,以及所有的连边

    2. 将入度为0的点放入队列

    3.从队列中取出一个点,将其连边的入度-1

    4. 一旦有新的入度为0的点,放入队列中,重复3-4

则队列出队的顺序就是拓扑排序。

2. 案例

题目:课程顺序

现在总共有 numCourses 门课需要选,记为 0 到 numCourses-1。

给定一个数组 prerequisites ,它的每一个元素 prerequisites[i] 表示两门课程之间的先修顺序。 例如 prerequisites[i] = [ai, bi] 表示想要学习课程 ai ,需要先完成课程 bi 。

请根据给出一个可行的修课序列。

输入: numCourses = 2, prerequisites = [[1,0]] 
输出: [0,1]
解释: 总共有 2 门课程。要学习课程 1,你需要先完成课程 0。因此,正确的课程顺序为 [0,1] 

 

题解

    求拓扑排序的结构,拓扑排序的模板如下:

class Solution {
        public int[] findOrder(int numCourses, int[][] prerequisites) {
            Queue<Integer> queue = new ArrayDeque<>();
            Map<Integer, List<Integer>> map = new HashMap<>();
            int book[] = new int[numCourses], index = 0, res[] = new int[numCourses];

            for (int i = 0; i < prerequisites.length; i++) {
                int later = prerequisites[i][1];
                int first = prerequisites[i][0];

                book[first]++;
                map.putIfAbsent(later, new ArrayList<>());
                map.get(later).add(first);
            }

            for (int i = 0; i < numCourses; i++) {
                if (book[i] == 0) {
                    queue.add(i);
                }
            }

            while (!queue.isEmpty()) {
                int temp = queue.poll();
                res[index++] = temp;

                if (map.get(temp) != null) {
                    for (int num : map.get(temp)) {
                        book[num]--;
                        if (book[num] == 0) queue.add(num);
                    }
                }
            }

            return index==numCourses?res:new int[0];
        }
    }

 

posted @ 2021-12-19 19:08  言思宁  阅读(92)  评论(0编辑  收藏  举报