0


力扣210. 课程表 II

深度优先遍历

  • 思路: - 搜索逻辑参见​​​​​​力扣207.课程表- 需要课程安排的顺序,课程搜索完成时,将其存储起来即可;- 存储课程的顺序需要注意: - 输入依赖中 [A, B]- 图中表示 B -> A ,表示先 B 后 A;- 可能有其他课程也会依赖 A,比如 [C, A],有向图表示 A -> C;- 先标记染色的是叶子节点 C,而先需要安排的课程是 B;- 所以存储顺序需要反向;(所以 207 课程表中的思路逻辑描述有误)
  1. class Solution {
  2. public:
  3. vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
  4. digraph.resize(numCourses);
  5. visited.resize(numCourses);
  6. for (const auto & info : prerequisites) {
  7. digraph[info[1]].push_back(info[0]);
  8. }
  9. for (int i = 0; i < numCourses && valid; ++i) {
  10. if (visited[i] == 0) {
  11. dfs(i);
  12. }
  13. }
  14. if (!valid) {
  15. return {};
  16. }
  17. std::reverse(result.begin(), result.end());
  18. return result;
  19. }
  20. private:
  21. void dfs(int u) {
  22. // to search state
  23. visited[u] = 1;
  24. for (int v : digraph[u]) {
  25. // init state
  26. if (visited[v] == 0) {
  27. dfs(v);
  28. if (!valid) {
  29. return;
  30. }
  31. } else if (visited[v] == 1) {
  32. // ring
  33. valid = false;
  34. return;
  35. }
  36. }
  37. visited[u] = 2;
  38. result.push_back(u);
  39. }
  40. private:
  41. std::vector<std::vector<int>> digraph;
  42. std::vector<int> visited;
  43. std::vector<int> result;
  44. bool valid = true;
  45. };

本文转载自: https://blog.csdn.net/N_BenBird/article/details/135577029
版权归原作者 slowfastflow 所有, 如有侵权,请联系我们删除。

“力扣210. 课程表 II”的评论:

还没有评论