<数据结构>拓扑排序解决课程表问题

  做的一个关于拓扑排序的练习,用拓扑排序解决课程表问题.即LeetCode第207题.

  问题描述: 现在你总共有 n 门课需要选,记为 0 到 n-1。在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1].给定课程总量以及它们的先决条件,判断是否可能完成所有课程的学习.

很明显,可以用拓扑排序来完成这类问题.代码如下:

  //课程名称用数字代表,起始编号为0
    public static boolean topSort(int numCourses, int[][] prerequisites) {
        int[] indegree = new int[numCourses];
        //遍历数组,提取每门课程的入度
        for (int[] pre : prerequisites) {
            indegree[pre[0]]++;
        }
        //创建一个队列,用来存放入度为0的课
        Queue<Integer> queue = new LinkedList<>();
        for (int i = 0; i < indegree.length; i++) {
            if (indegree[i] == 0) {
                queue.add(i);
            }
        }
        //循环取出队首的课,每次取出后让课程总数减一
        while (!queue.isEmpty()) {
            int k = queue.remove();
            //输出课程编号
            System.out.println(k);
            numCourses--;
            //把对课程k有依赖的课的入度减1,并判断该课的入度是否为0,若为0则加入队列
            for (int[] pre : prerequisites) {
                if (pre[1] == k) {
                    indegree[pre[0]]--;
                    if (indegree[pre[0]] == 0) {
                        queue.add(pre[0]);
                    }
                }
            }
        }

        //如果课程总数等于0,则说明可完成所有课程学习
        if (numCourses == 0) {
            return true;
        } else {
            return false;
        }
    }
   
   

猜你喜欢

转载自www.cnblogs.com/wangxiaoqian/p/11910947.html