`

Course Schedule

阅读更多
There are a total of n courses you have to take, labeled from 0 to n - 1.

Some courses may have prerequisites, for example to take course 0 you have to first take course 1, which is expressed as a pair: [0,1]

Given the total number of courses and a list of prerequisite pairs, is it possible for you to finish all courses?

For example:

2, [[1,0]]
There are a total of 2 courses to take. To take course 1 you should have finished course 0. So it is possible.

2, [[1,0],[0,1]]
There are a total of 2 courses to take. To take course 1 you should have finished course 0, and to take course 0 you should also have finished course 1. So it is impossible.

Note:
The input prerequisites is a graph represented by a list of edges, not adjacency matrices.

这是一道有关图的经典题,本质就是能否进行拓扑排序,拓扑排序必须是有向无环图,因此我们要判断每个顶点开始是否有环,如果有环就不能进行拓扑排序,如果没有就可以,返回false,这种方法是DFS实现。我们还可以用BFS方法来解决,用BFS时主要要维护一个入度为0的集合,我们用队列来实现。下面是代码实现:

DFS:
public class Solution {
    boolean[] isVisited;
    boolean[] onStack;
    public boolean canFinish(int numCourses, int[][] prerequisites) {
        if(prerequisites == null || prerequisites.length == 0) return true;
        List<Integer>[] graph = new List[numCourses];
        isVisited = new boolean[numCourses];
        onStack = new boolean[numCourses];
        for(int i = 0; i < prerequisites.length; i++) {
            int key = prerequisites[i][1];
            int value = prerequisites[i][0];
            if(graph[key] == null) graph[key] = new ArrayList<Integer>();
            graph[key].add(value);
        }
        for(int i = 0; i < numCourses; i++) {
            if(isVisited[i] == false && hasCycle(i, graph) == true) return false;
        }
        return true;
    }
    
    public boolean hasCycle(int v, List<Integer>[] graph) {
        boolean cycle = false;
        isVisited[v] = true;
        onStack[v] = true;
        if(graph[v] != null) {
            for(int i : graph[v]) {
                if(isVisited[i] != true) {
                    cycle = hasCycle(i, graph);
                    if(cycle == true)
                        break;
                } else if(onStack[i] == true) {
                    cycle = true;
                    break;
                }
            }
        }
        onStack[v] = false;
        return cycle;
    }
}


BFS:
public class Solution {
    public boolean canFinish(int numCourses, int[][] prerequisites) {
       if(prerequisites == null || prerequisites.length == 0) return true;
       int[] degree = new int[numCourses];
       List<Integer>[] graph = new List[numCourses];
       Queue<Integer> qSet = new LinkedList<Integer>();
       int edges = prerequisites.length;
       for(int i = 0; i < prerequisites.length; i++) {
           degree[prerequisites[i][0]] ++;
           int key = prerequisites[i][1];
           int value = prerequisites[i][0];
           if(graph[key] == null) graph[key] = new ArrayList<Integer>();
           graph[key].add(value);
       }
       for(int i = 0; i < degree.length; i++) {
           if(degree[i] == 0)
                qSet.offer(i);
       }
       while(!qSet.isEmpty()) {
           int tem = qSet.poll();
           if(graph[tem] != null) {
               for(int v : graph[tem]) {
                   edges --;
                   if(--degree[v] == 0)
                        qSet.offer(v);
               }
           }
       }
       if(edges != 0) return false;
       return true;
    }
}
分享到:
评论

相关推荐

    java-leetcode题解之Course Schedule III.java

    java java_leetcode题解之Course Schedule III.java

    University Course Schedule Builder-开源

    "University Course Schedule Builder",一款开源的课程日程规划工具,以其独特的优势,为大学提供了定制化、高效且灵活的课表解决方案。 开源软件的一大优势在于其开放源代码,允许用户自由查看、修改和分发代码。...

    ECSU Course Schedule Assistant-crx插件

    确定课程列表的可能时间表 这是一项扩展功能,可帮助康涅狄格州立大学的学生选择时间表。 ...该扩展程序然后显示一个新页面,其中显示可用的课程表,确保不存在时间冲突。 然后,学生可以通过选择包括或排除课程的特定...

    CourseSchedule:软件项目挑战

    课程时间表 열어버렸네제인데인데로열어버렸네? 내버린로보보다?...如果在Schedule中插入更多属性或删除某些现有属性,则还需要修改ScheduleList和gui Schedule I / O Form(如ScheduleTable和InputPanel)。

    Course Schedule Generator-开源

    完成的项目。 有些功能并不完全智能,但它们可以工作。 如果它阻止使用程序,请报告错误。 该程序是完全开源的,并使用诺基亚 qt [http://qt.nokia.com/] 制作。 联系以获取更多信息或问题。

    类图练习题参考.pdf

    3. 在课程注册系统中,定义了类 CourseSchedule 和类 Course,并在类 CourseSchedule 中定义了方法 add(c:Course)和方法 remove(c:Course),则类 CourseSchedule 和类 Course 之间的关系是关联关系。因为类 ...

    PeopleSoft Course Schedule Export-crx插件

    语言:English 一键导出课程表,并在PeopleSoft网站上提供有用的快捷方式 功能此扩展可帮助学生有效地跟踪他们的课程,最大程度地减少混乱和错过的课程。 它与学校的课程选择网站集成,自动将课程信息解析为重复的...

    Pretty UW Course Schedule-crx插件

    语言:English 美化UWaterloo课程表页面! 一个简单的Chrome扩展程序,改善了滑铁卢大学课程表页面的外观。 1.0.7中的新增功能:*扩展名将在新的课程表URL(classes.uwaterloo.ca)上激活。功能包括:*重组的课程搜索...

    ScheduleViz: Course Schedule Plannner-开源

    **ScheduleViz:开源课程日程规划器** ScheduleViz是一个专为大学学生和教育机构设计的开源项目,它提供了一个交互式的、基于时间表数据的课程安排工具。这款工具利用Perl CGI(Common Gateway Interface)脚本来...

    数据库原理作业11

    σ(星期=周一 ∧ 时间=8:00(course schedule)) ⋈ course ``` 5. **查找计算机学院的所有任课老师(姓名):** ``` (σ(院系=计算机(course)) ⋈ teacher) ``` 这些关系代数表达式展示了如何利用数据库的...

    教学管理系统--综合案例

    例如,可以建立一个名为`CourseSchedule`的表来存储课程信息,其中可能包含以下字段: - `course_id` (课程ID) - `course_name` (课程名称) - `teacher_id` (教师ID) - `semester` (学期) 为了查询特定学期的所有...

    漂亮的UW课程表「Pretty UW Course Schedule」-crx插件

    改进观看滑铁卢大学课程表的页面 一个简单的Chrome扩展程序,改善了滑铁卢大学课程表页面的外观。 1.0.4中的新增功能:-在某些情况下修复了类具有“封闭部分”的表格渲染-改进了表单上最新术语的计算功能包括:*重组...

    python-leetcode题解之207-Course-Schedule.py

    python python_leetcode题解之207_Course_Schedule.py

    UML试题及答案,很有用!

    - 解析:因为 CourseSchedule 使用 Course 类,但并不直接拥有或持久化 Course,所以是依赖关系。 8. 正确的说法是( C ) - 答案:活动图和状态图是对一个对象的生命周期进行建模,描述对象随时间变化的行为。 - ...

    UML统一建模语言 快速学习

    CourseSchedule -&gt; Course: Add(c: Course), Remove(c: Course) ``` #### 九、UML中的关联和聚合 - **关联**:表示类之间的关系,可以通过名称、角色和多重性来描述。 - **聚合**(Aggregation):表示类之间的...

    UML考试题型及答案,有用!

    因为CourseSchedule类的方法add()和remove()依赖于Course类的对象。 8. **状态图和活动图的对比**:状态图是活动图的一个特例,主要描述一个对象的生命周期,而不是系统的静态方面。两者都描述对象随时间变化的行为...

    使用python实现课表的爬取

    url = "http://example.com/courseschedule" # 五邑大学课表URL response = requests.get(url) if response.status_code == 200: html_content = response.text else: print("请求失败") ``` 3. **解析HTML...

    软件工程课件:补充-UML快速入门.ppt

    依赖关系如"CourseSchedule"依赖于"Course",表示课程安排依赖于课程的设置。泛化关系如"交通工具"和"火车",表示火车是交通工具的一种。实现关系如"Control"接口被"TV"和"Radio"类实现,表示这两个类实现了控制的...

    c++习题集第四章.pdf

    可以通过 UML 方法显示表示出 CourseSchedule 类中的成员函数 add 和 remove 的参数是 Course 类的对象的依赖关系。 4.18 院系人员信息系统的 UML 图形表示 可以根据大学院系人员信息系统中的关系描述绘制出相应的...

Global site tag (gtag.js) - Google Analytics