zoukankan      html  css  js  c++  java
  • 207. Course Schedule

    #week17

    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:

    1. The input prerequisites is a graph represented by a list of edges, not adjacency matrices. Read more about how a graph is represented.
    2. You may assume that there are no duplicate edges in the input prerequisites.

    分析

    这一题,很明显,可以看是否能够得到一个拓扑序列,就可以看能够完成

    其实也就是检验是否是一个有环的图,如果有环就没法完成课程

    如果无环则可以

    所以检验有环无环,就可以通过求拓扑或者DFS等方式完成

    题解

    这个是摘要别人的BFS代码,我这个写的有点多有点丑:

     1 class Solution {
     2 public:
     3     bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) {
     4         vector<unordered_set<int>> graph = make_graph(numCourses, prerequisites);
     5         vector<int> degrees = compute_indegree(graph);
     6         for (int i = 0; i < numCourses; i++) {
     7             int j = 0;
     8             for (; j < numCourses; j++)
     9                 if (!degrees[j]) break;
    10             if (j == numCourses) return false;
    11             degrees[j] = -1;
    12             for (int neigh : graph[j])
    13                 degrees[neigh]--;
    14         }
    15         return true;
    16     }
    17 private:
    18     vector<unordered_set<int>> make_graph(int numCourses, vector<pair<int, int>>& prerequisites) {
    19         vector<unordered_set<int>> graph(numCourses);
    20         for (auto pre : prerequisites)
    21             graph[pre.second].insert(pre.first);
    22         return graph;
    23     }
    24     vector<int> compute_indegree(vector<unordered_set<int>>& graph) {
    25         vector<int> degrees(graph.size(), 0);
    26         for (auto neighbors : graph)
    27             for (int neigh : neighbors)
    28                 degrees[neigh]++;
    29         return degrees;
    30     }
    31 }; 
  • 相关阅读:
    R语言中获取当前目录
    Error : .onLoad failed in loadNamespace() for 'rJava', details: call: inDL(x, as.logical(local), as.logical(now), ...) error: 无法载入共享目标对象‘D:/Program Files/R/R-3.2.2/library/rJava/libs/x64/rJava.dll
    Ubuntu打开系统监视器
    Myeclipse中js总是报错
    ubuntu 卸载 google-chrome
    ubuntu下安装myeclipse+破解
    bzoj2085-POI2010-Hamsters
    bzoj1061-[Noi2008]志愿者招募-单纯形 & 费用流
    bzoj2716-天使玩偶
    bzoj3779-重组病毒
  • 原文地址:https://www.cnblogs.com/iamxiaoyubei/p/8278279.html
Copyright © 2011-2022 走看看