diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/7.leetcode\345\233\276\344\270\216\346\220\234\347\264\242/206_\350\257\276\347\250\213\350\241\250/config.json" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/7.leetcode\345\233\276\344\270\216\346\220\234\347\264\242/206_\350\257\276\347\250\213\350\241\250/config.json" new file mode 100644 index 0000000000000000000000000000000000000000..f53bdea562b851920b2440a1d4a1605f9cab0d32 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/7.leetcode\345\233\276\344\270\216\346\220\234\347\264\242/206_\350\257\276\347\250\213\350\241\250/config.json" @@ -0,0 +1,12 @@ +{ + "node_id": "569d5e11c4fc5de7844053d9a733c5e8", + "keywords": [ + "leetcode", + "课程表" + ], + "children": [], + "export": [ + "solution.json" + ], + "title": "课程表" +} \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/7.leetcode\345\233\276\344\270\216\346\220\234\347\264\242/206_\350\257\276\347\250\213\350\241\250/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/7.leetcode\345\233\276\344\270\216\346\220\234\347\264\242/206_\350\257\276\347\250\213\350\241\250/desc.html" new file mode 100644 index 0000000000000000000000000000000000000000..b38280a32fea5eecf59d01cd87490bdadb54faad --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/7.leetcode\345\233\276\344\270\216\346\220\234\347\264\242/206_\350\257\276\347\250\213\350\241\250/desc.html" @@ -0,0 +1,37 @@ +

你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1

+ +

在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出,其中 prerequisites[i] = [ai, bi] ,表示如果要学习课程 ai必须 先学习课程  bi

+ + + +

请你判断是否可能完成所有课程的学习?如果可以,返回 true ;否则,返回 false

+ +

 

+ +

示例 1:

+ +
+输入:numCourses = 2, prerequisites = [[1,0]]
+输出:true
+解释:总共有 2 门课程。学习课程 1 之前,你需要完成课程 0 。这是可能的。
+ +

示例 2:

+ +
+输入:numCourses = 2, prerequisites = [[1,0],[0,1]]
+输出:false
+解释:总共有 2 门课程。学习课程 1 之前,你需要先完成​课程 0 ;并且学习课程 0 之前,你还应先完成课程 1 。这是不可能的。
+ +

 

+ +

提示:

+ + diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/7.leetcode\345\233\276\344\270\216\346\220\234\347\264\242/206_\350\257\276\347\250\213\350\241\250/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/7.leetcode\345\233\276\344\270\216\346\220\234\347\264\242/206_\350\257\276\347\250\213\350\241\250/solution.cpp" new file mode 100644 index 0000000000000000000000000000000000000000..f0a99949cfb256d22367054cc02a03ad03fea106 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/7.leetcode\345\233\276\344\270\216\346\220\234\347\264\242/206_\350\257\276\347\250\213\350\241\250/solution.cpp" @@ -0,0 +1,40 @@ +#include +using namespace std; + +class Solution +{ +public: + bool canFinish(int numCourses, vector> &prerequisites) + { + + vector> graph(numCourses, vector()); + + for (auto num : prerequisites) + { + graph[num[1]].push_back(num[0]); + } + vector visit(numCourses); + + for (int i = 0; i < numCourses; i++) + { + if (!dfs(graph, visit, i)) + return false; + } + return true; + } + bool dfs(vector> &g, vector &visit, int i) + { + if (visit[i] == -1) + return false; + if (visit[i] == 1) + return true; + visit[i] = -1; + for (auto a : g[i]) + { + if (!dfs(g, visit, a)) + return false; + } + visit[i] = 1; + return true; + } +}; \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/7.leetcode\345\233\276\344\270\216\346\220\234\347\264\242/206_\350\257\276\347\250\213\350\241\250/solution.json" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/7.leetcode\345\233\276\344\270\216\346\220\234\347\264\242/206_\350\257\276\347\250\213\350\241\250/solution.json" new file mode 100644 index 0000000000000000000000000000000000000000..378ec7c3bd5779f1d0419c845d911690894a4632 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/7.leetcode\345\233\276\344\270\216\346\220\234\347\264\242/206_\350\257\276\347\250\213\350\241\250/solution.json" @@ -0,0 +1,6 @@ +{ + "type": "code_options", + "author": "CSDN.net", + "source": "solution.md", + "exercise_id": "faf3b0518667467b971e642c5ed5b077" +} \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/7.leetcode\345\233\276\344\270\216\346\220\234\347\264\242/206_\350\257\276\347\250\213\350\241\250/solution.md" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/7.leetcode\345\233\276\344\270\216\346\220\234\347\264\242/206_\350\257\276\347\250\213\350\241\250/solution.md" new file mode 100644 index 0000000000000000000000000000000000000000..9b6b6cc8cb5570ef337b35a37ca961acc7470a8a --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/7.leetcode\345\233\276\344\270\216\346\220\234\347\264\242/206_\350\257\276\347\250\213\350\241\250/solution.md" @@ -0,0 +1,231 @@ +# 课程表 +

你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1

+ +

在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出,其中 prerequisites[i] = [ai, bi] ,表示如果要学习课程 ai必须 先学习课程  bi

+ +
    +
  • 例如,先修课程对 [0, 1] 表示:想要学习课程 0 ,你需要先完成课程 1
  • +
+ +

请你判断是否可能完成所有课程的学习?如果可以,返回 true ;否则,返回 false

+ +

 

+ +

示例 1:

+ +
+输入:numCourses = 2, prerequisites = [[1,0]]
+输出:true
+解释:总共有 2 门课程。学习课程 1 之前,你需要完成课程 0 。这是可能的。
+ +

示例 2:

+ +
+输入:numCourses = 2, prerequisites = [[1,0],[0,1]]
+输出:false
+解释:总共有 2 门课程。学习课程 1 之前,你需要先完成​课程 0 ;并且学习课程 0 之前,你还应先完成课程 1 。这是不可能的。
+ +

 

+ +

提示:

+ +
    +
  • 1 <= numCourses <= 105
  • +
  • 0 <= prerequisites.length <= 5000
  • +
  • prerequisites[i].length == 2
  • +
  • 0 <= ai, bi < numCourses
  • +
  • prerequisites[i] 中的所有课程对 互不相同
  • +
+ +

以下错误的选项是?

+## aop +### before +```cpp +#include +using namespace std; +``` +### after +```cpp + +``` + +## 答案 +```cpp +class Solution +{ +public: + bool canFinish(int numCourses, vector> &prerequisites) + { + + unordered_map> rels; + int *inDs = new int[numCourses]; + for (int i = 0; i < numCourses; i++) + { + inDs[i] = 0; + vector temp; + rels[i] = temp; + } + + for (int i = 0; i < prerequisites.size(); i++) + { + rels[prerequisites[i][1]].push_back(prerequisites[i][0]); + inDs[prerequisites[i][0]]++; + } + queue zeroInD; + int num = 0; + while (num != numCourses) + { + for (int i = 0; i < numCourses; i++) + { + if (inDs[i] == 0) + { + zeroInD.push(i); + num++; + inDs[i] = -1; + } + } + if (zeroInD.empty() && num != numCourses) + return false; + while (!zeroInD.empty()) + { + int topV = zeroInD.front(); + zeroInD.pop(); + vector topVEdges = rels[topV]; + for (int j = 0; j < topVEdges.size(); j++) + { + inDs[topVEdges[j]]++; + } + } + } + if (num == numCourses) + return true; + else + return false; + } +}; +``` +## 选项 + +### A +```cpp +class Solution +{ +public: + bool canFinish(int numCourses, vector> &prerequisites) + { + if (numCourses == 0) + return true; + + vector course(numCourses, 0); + vector> rela(numCourses); + for (int i = 0; i < prerequisites.size(); i++) + { + course[prerequisites[i][0]]++; + rela[prerequisites[i][1]].push_back(prerequisites[i][0]); + } + + queue cq; + for (int i = 0; i < numCourses; i++) + if (course[i] == 0) + cq.push(i); + + int num = numCourses; + while (!cq.empty()) + { + int c = cq.front(); + cq.pop(); + num--; + for (int i = 0; i < rela[c].size(); i++) + { + int this_course = rela[c][i]; + course[this_course]--; + if (course[this_course] == 0) + cq.push(this_course); + } + } + return num == 0 ? true : false; + } +}; +``` + +### B +```cpp +class Solution +{ +public: + bool canFinish(int numCourses, vector> &prerequisites) + { + vector res, degree(numCourses, 0); + unordered_map> map; + + for (auto &e : prerequisites) + { + map[e[1]].push_back(e[0]); + degree[e[0]]++; + } + + queue q; + for (int i = 0; i < numCourses; i++) + { + if (degree[i] == 0) + { + q.push(i); + } + } + while (!q.empty()) + { + int cur = q.front(); + res.push_back(cur); + q.pop(); + for (auto &next : map[cur]) + { + degree[next]--; + if (degree[next] == 0) + q.push(next); + } + } + return res.size() == numCourses; + } +}; +``` + +### C +```cpp +class Solution +{ +public: + bool canFinish(int numCourses, vector> &prerequisites) + { + + vector> graph(numCourses, vector()); + + for (auto num : prerequisites) + { + graph[num[1]].push_back(num[0]); + } + vector visit(numCourses); + + for (int i = 0; i < numCourses; i++) + { + if (!dfs(graph, visit, i)) + return false; + } + return true; + } + bool dfs(vector> &g, vector &visit, int i) + { + if (visit[i] == -1) + return false; + if (visit[i] == 1) + return true; + visit[i] = -1; + for (auto a : g[i]) + { + if (!dfs(g, visit, a)) + return false; + } + visit[i] = 1; + return true; + } +}; +```