diff --git a/solutions/210. Course Schedule II.md b/solutions/210. Course Schedule II.md new file mode 100644 index 0000000..64772d7 --- /dev/null +++ b/solutions/210. Course Schedule II.md @@ -0,0 +1,71 @@ +# [210. Course Schedule II](https://leetcode.com/problems/course-schedule-ii/) +# 思路 +这题是`207. Course Schedule`的变体,207题要求判断是否可以完成整个课程,即判断有向图是否有环,然后我们用拓扑排序来判断是否有环。 +而这题其实就是求有向图的拓扑排序,也分为BFS和DFS两种,思路和207一样的,所以这里不再赘述,可参考[207题解](https://github.com/ShusenTang/LeetCode/blob/master/solutions/207.%20Course%20Schedule.md)。 + +# C++ +## BFS +``` C++ +class Solution { +public: + vector findOrder(int numCourses, vector>& prerequisites) { + int arc_num = prerequisites.size(); + stackstk; + vectorin_degree(numCourses, 0); + vector>G(numCourses, vector{}); + vectorres; + + for(auto &arc : prerequisites){ // 建图 + in_degree[arc[0]]++; + G[arc[1]].push_back(arc[0]); + } + + for(int i = 0; i < numCourses; i++) // 先将所有入度为0的顶点入栈 + if(!in_degree[i]) stk.push(i); + + while(!stk.empty()){ + int course = stk.top(); stk.pop(); + res.push_back(course); + for(int c: G[course]){ // 所有以course为起点的边的终点 + if(!(--in_degree[c])) stk.push(c); + } + } + return res.size() == numCourses ? res : vector{}; + } +}; +``` + +## DFS +``` C++ +class Solution { +private: + bool DFS(vector>&G, vector& visited, vector& res, int i) { + if (visited[i] == -1) return false; + if (visited[i] == 1) return true; + visited[i] = -1; + for (auto a : G[i]) { + if (!DFS(G, visited, res, a)) return false; + } + res.push_back(i); + visited[i] = 1; + return true; + } +public: + vector findOrder(int numCourses, vector>& prerequisites) { + vector> G(numCourses, vector()); + vectorvisited(numCourses, 0); + vectorres; + + for (auto &arc : prerequisites) { + G[arc[1]].push_back(arc[0]); + } + + for (int i = 0; i < numCourses; ++i) + if (!DFS(G, visited, res, i)) return vector{}; + + // 注意最后要翻转一下 + reverse(res.begin(), res.end()); + return res; + } +}; +```