zoukankan      html  css  js  c++  java
  • 207. 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. Read more about how a graph is represented.

    click to show more hints.

    Hints:
    1. This problem is equivalent to finding if a cycle exists in a directed graph. If a cycle exists, no topological ordering exists and therefore it will be impossible to take all courses.
    2. Topological Sort via DFS - A great video tutorial (21 minutes) on Coursera explaining the basic concepts of Topological Sort.
    3. Topological sort could also be done via BFS.

    链接: http://leetcode.com/problems/course-schedule/ 

    6/28/2017

    有向图,先求indegree,然后每次从queue当中取出来indegree为0的课程,最后看queue当中是否为空。

    Kahn's Algorithms

     1 public class Solution {
     2     public boolean canFinish(int numCourses, int[][] prerequisites) {
     3         // calculate indegree
     4         int[] indegree = new int[numCourses];
     5         List<List<Integer>> graph = new ArrayList<>();
     6         for (int i = 0; i < numCourses; i++) {
     7             graph.add(new ArrayList<Integer>());
     8         }
     9         for (int i = 0; i < prerequisites.length; i++) {
    10             indegree[prerequisites[i][0]]++;
    11             graph.get(prerequisites[i][1]).add(prerequisites[i][0]);
    12         }
    13         
    14         Queue<Integer> q = new LinkedList<Integer>();
    15         // add indegree == 0 vertex to queue
    16         for (int i = 0; i < numCourses; i++) {
    17             if (indegree[i] == 0) {
    18                 q.add(i);
    19             }
    20         }
    21 
    22         int counter = 0;
    23         while (!q.isEmpty()) {
    24             int vertex = q.poll();
    25             counter++;
    26             // decrease all adjacent vertex indegree by 1
    27             int adjacentVertexLength = graph.get(vertex).size();
    28             for (int i = 0; i < adjacentVertexLength; i++) {
    29                 int w = graph.get(vertex).get(i);
    30                 indegree[w]--;
    31                 // check if new indegree is 0
    32                 if (indegree[w] == 0) {
    33                     q.add(w);
    34                 }
    35             }
    36         }
    37         
    38         return counter == numCourses;
    39     }
    40 }

    这道题很久之前做的,思路已经忘记了,具体题解可以参考:

    http://www.cnblogs.com/yrbbest/p/4493547.html

    求Course Schedule,等同问题是有向图检测环,vertex是course, edge是prerequisite。我觉得一般会使用Topological Sorting拓扑排序来检测。一个有向图假如有环则不存在Topological Order。一个DAG的Topological Order可以有大于1种。 常用的Topological Sorting算法有两种

    1. Kahn's Algorithms (wiki): BFS based, start from with vertices with 0 incoming edge,insert them into list S,at the same time we remove all their outgoing edges,after that find new vertices with 0 incoming edges and go on. 详细过程见Reference里Brown大学的课件。
    2. Tarjan's Algorithms (wiki): DFS based, loop through each node of the graph in an arbitrary order,initiating a depth-first search that terminates when it hits any node that has already been visited since the beginning of the topological sort or the node has no outgoing edges (i.e. a leaf node). 详细过程见Reference里 NYU的课件。

    别人的解法

    https://discuss.leetcode.com/topic/17273/18-22-lines-c-bfs-dfs-solutions

    https://discuss.leetcode.com/topic/13854/easy-bfs-topological-sort-java

    https://discuss.leetcode.com/topic/25964/ac-python-topological-sort-52-ms-solution-o-v-e-time-and-o-v-e-space

    更多讨论

    https://discuss.leetcode.com/category/215/course-schedule

  • 相关阅读:
    Centos6.4 cobbler安装要点
    zabbix oracle监控插件orabbix部署安装
    CPP
    基于curl 的zabbix API调用
    oracle 存储过程
    sqlplus乱码
    Intent之对象传递(Parcelable传递对象和对象集合)
    IOS压缩解压缩
    深入浅出java静态代理和动态代理
    c语言用rand() 函数,实现random(int m)
  • 原文地址:https://www.cnblogs.com/panini/p/7173769.html
Copyright © 2011-2022 走看看