zoukankan      html  css  js  c++  java
  • 8.4 课程表

    207. 课程表
    你这个学期必须选修 numCourse 门课程,记为 0 到 numCourse-1 。
    
    在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们:[0,1]
    
    给定课程总量以及它们的先决条件,请你判断是否可能完成所有课程的学习?
    
     
    
    示例 1:
    
    输入: 2, [[1,0]] 
    输出: true
    解释: 总共有 2 门课程。学习课程 1 之前,你需要完成课程 0。所以这是可能的。
    示例 2:
    
    输入: 2, [[1,0],[0,1]]
    输出: false
    解释: 总共有 2 门课程。学习课程 1 之前,你需要先完成​课程 0;并且学习课程 0 之前,你还应先完成课程 1。这是不可能的。
     
    
    提示:
    
    输入的先决条件是由 边缘列表 表示的图形,而不是 邻接矩阵 。详情请参见图的表示法。
    你可以假定输入的先决条件中没有重复的边。
    1 <= numCourses <= 10^5
    
    /**
     * @author athonyw
     * @version init
     * @date 2020/8/4 12:55 下午
     */
    // 判断是否存在拓扑排序
    public class canFinish {
        List<List<Integer>> edges;
        int[] visited;
        boolean valid = true;
    
        public boolean canFinish(int numCourses, int[][] prerequisites) {
            edges = new ArrayList<List<Integer>>();
            for (int i = 0; i < numCourses; ++i) {
                edges.add(new ArrayList<Integer>());
            }
            visited = new int[numCourses];
            for (int[] info : prerequisites) {
                // 给每个课程进行添加后置课程
                // 学习了info[1] 才能学习 info[0]
                edges.get(info[1]).add(info[0]);
            }
            // 对每一门课进行遍历
            for (int i = 0; i < numCourses && valid; ++i) {
                if (visited[i] == 0) {
                    dfs(i);
                }
            }
            return valid;
        }
    
        private void dfs(int u){
            // 遍历过标记为1
            visited[u] = 1;
            // 对该门课程来说,学习之后可以学习哪些课程
            for (int v: edges.get(u)) {
                // 如果后置还没学过,就继续遍历
                if (visited[v] == 0) {
                    dfs(v);
                    // 如果此时无效,就直接返回
                    if (!valid) {
                        return;
                    }
                } else if (visited[v] == 1) {
                    // 如果已经学习了,成就了环,直接推出。
                    valid = false;
                    return;
                }
            }
            // 如果后置完成了,就直接标记为完成
            visited[u] = 2;
        }
    }
    
    
  • 相关阅读:
    《有毒》读后感 读书笔记
    《自动时代》读后感 读书笔记
    HTML 中有用的字符实体
    input 光标在 chrome下不兼容 解决方案
    form注册表单圆角 demo
    横向导航二级菜单
    鼠标悬浮,下拉菜单,距离一定距离
    纵向折叠二级菜单(无限点击)
    纵向折叠二级菜单
    纵向导航二级弹出菜单
  • 原文地址:https://www.cnblogs.com/athony/p/13432850.html
Copyright © 2011-2022 走看看