207. 课程表

验证课程安排图是否是有向无环图(DAG)。通过拓扑排序判断此课程安排图是否是有向无环图。

方法一:BFS

BFS用到的主要数据结构就是队列,如果存在环那么一定有节点的入度始终不为0.

具体原理和图解可以参考课程表(拓扑排序:入度表BFS法 / DFS法,清晰图解),这里给出ACM模式下C++的代码实现:

#include<queue>
#include<vector>
#include<list>
#include<iostream>
using namespace std;class Solution {public:bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {vector<int> indegree(numCourses, 0);                //入度表vector<vector<int>> adj(numCourses, vector<int>()); //后驱结点queue<int> preq;    //队列for (auto t : prerequisites) {indegree[t[0]]++;adj[t[1]].push_back(t[0]);}for (int i = 0; i < numCourses; i++) {if (indegree[i] == 0) preq.push(i);}while (!preq.empty()) {int pre = preq.front();numCourses--;preq.pop();for (int cur : adj[pre]) {if (--indegree[cur] == 0) {preq.push(cur);}}}return numCourses == 0;}
};int main() {int num;cin >> num;int prev, last;vector<vector<int>> prereq;while (cin >> last >> prev) {//输入EOF表示输入结束,将跳出while循环vector<int> tmp;tmp.push_back(last);tmp.push_back(prev);prereq.push_back(tmp);}Solution st;cout << st.canFinish(num, prereq);return 0;
}

方法二:DFS

DFS用到的主要数据结构为,在一般实现当中,会直接利用递归写代码,因为程序中的递归实际上也是栈的一种表现形式。

终止条件:

当 flag[i] == -1,说明当前访问节点已被其他节点启动的 DFS 访问,无需再重复搜索,直接返回 True。

当 flag[i] == 1,说明在本轮 DFS 搜索中节点 i 被第 2 次访问,即 课程安排图有环 ,直接返回 False。

未被 DFS 访问:i == 0

/* DFS */
class Solution {public:bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {vector<vector<int>> adj(numCourses, vector<int>()); //后驱结点vector<int> flags(numCourses, 0);for (auto t : prerequisites) {adj[t[1]].push_back(t[0]);}for (int i = 0; i < numCourses; i++) {if (!dfs(adj, flags, i)) return false;}return true;}
private:bool dfs(vector<vector<int>>& adj, vector<int>& flags, int i) {if (flags[i] == 1) return false;if (flags[i] == -1) return true;flags[i] = 1;for (int j : adj[i]) {if (!dfs(adj, flags, j))return false;}flags[i] = -1;return true;}
};int main() {int num;cin >> num;int prev, last;vector<vector<int>> prereq;while (cin >> last >> prev) {//输入EOF表示输入结束,将跳出while循环vector<int> tmp;tmp.push_back(last);tmp.push_back(prev);prereq.push_back(tmp);}Solution st;cout << st.canFinish(num, prereq);return 0;
}

输出选课顺序

210.课程表 II 需要输出选课顺序,只需要在返回时插入返回结果数组的头部即可。

DFS的代码实现如下:

#include<vector>
#include<iostream>
using namespace std;class Solution {public:vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {vector<int> flags(numCourses, 0);vector<vector<int>> adj(numCourses,vector<int>());vector<int> res(numCourses);res.clear();for (auto tmp : prerequisites) {adj[tmp[1]].push_back(tmp[0]);}for (int i = 0; i < numCourses; i++) {if (!dfs(adj, flags, i, res)) return vector<int>();}return res;}
private:bool dfs(vector<vector<int>>& adj, vector<int>& flags, int i, vector<int>& res) {if (flags[i] == 1) return false;if (flags[i] == -1) return true;flags[i] = 1;for (int j : adj[i]) {if (!dfs(adj, flags, j, res)) return false;}flags[i] = -1;res.emplace(res.begin(), i);return true;}
};int main() {int num;cin >> num;int prev, last;vector<vector<int>> prereq;while (cin >> last >> prev) {//输入EOF表示输入结束,将跳出while循环vector<int> tmp;tmp.push_back(last);tmp.push_back(prev);prereq.push_back(tmp);}Solution st;vector<int> res = st.findOrder(num, prereq);for (auto tp : res) {cout << tp << '\t';}return 0;
}

拓扑排序:LC 207. 课程表 210. 课程表 II相关推荐

  1. 20200806:Java拓扑排序实现力扣210课程表Ⅱ

    力扣210:课程表Ⅱ 题目 思路与算法 代码实现 题目 题目链接:课程表Ⅱ 现在你总共有 n 门课需要选,记为 0 到 n-1. 在选修某些课程之前需要一些先修课程. 例如,想要学习课程 0 ,你需要 ...

  2. 207.课程表 | 210.课程表II(拓扑排序)

    207.课程表 你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 . 在选修某些课程之前需要一些先修课程. 先修课程按数组 prerequisites 给出 ...

  3. 207. 课程表/210. 课程表 II

    2020-06-05 1.题目描述 课程表 2.题解 拓扑排序,首先我们需要一个入度矩阵和邻接表来存放相关的信息,将入度为0的点存入队列/栈,并且将 与其相连的点的入度减1,重复上述操作,如果此时学习 ...

  4. 【数据结构】AOV网——拓扑排序

    相关概念 AOV网 AOV网(Activity On Vertex Network)用顶点表示活动.边是无权的,仅仅用来表示前驱与后继关系. 前驱与后继 有向边的起点称为终点的前驱,有向边的终点称为起 ...

  5. [Leedcode][JAVA][第210 题][课程表 II][拓扑排序][BFS][DFS][有向图]

    [问题描述][第210 题][课程表 II][中等] 现在你总共有 n 门课需要选,记为 0 到 n-1.在选修某些课程之前需要一些先修课程. 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用 ...

  6. LeetCode 210. 课程表 II(拓扑排序)

    1. 题目 现在你总共有 n 门课需要选,记为 0 到 n-1. 在选修某些课程之前需要一些先修课程. 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1] 给定课 ...

  7. 【数据结构和算法】拓扑排序(附leetcode题 207/210 课程表)

    拓扑排序: 对于有向无环图,访问当前顶点时必须 保证指向该顶点的所有顶点已经访问过 作用: 1.得到一个[拓扑序](不唯一) 2.检测[有向图]是否有环:如果有拓扑排序则无环,否则有环 (如果存在环, ...

  8. [Leetcode][第207题][JAVA][课程表][拓扑排序][DFS]

    [问题描述][中等] [解答思路] 1. 拓扑排序 复杂度分析 HashSet[] 数组 import java.util.HashSet; import java.util.LinkedList; ...

  9. LeetCode 207. 课程表(拓扑排序)

    1. 题目 你这个学期必须选修 numCourse 门课程,记为 0 到 numCourse-1 . 在选修某些课程之前需要一些先修课程. 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个 ...

  10. leetcode *210. 课程表 II(拓补排序)(2020.5.17)

    [题目]*210. 课程表 II 现在你总共有 n 门课需要选,记为 0 到 n-1. 在选修某些课程之前需要一些先修课程. 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们 ...

最新文章

  1. Drupal 网站漏洞修复以及网站安全防护加固方法
  2. [React Router v4] Conditionally Render a Route with the Switch Component
  3. python 散点图_Python绘制散点图
  4. JSONEasy的用法(JSONDateHandler)
  5. 为Web程序员解毒:9个IE常见Bug的解决方案
  6. 绝对精华,大牛教你在Android系统上安装linux发行版
  7. 的原型是什么_学习服装原型是什么?
  8. 数据结构树及相关算法题
  9. 内存分配详解 malloc, new, HeapAlloc, VirtualAlloc,GlobalAlloc
  10. C语言入夏标志,青岛真的入夏了吗?青岛20°C的梗是什么?
  11. unity webPlayer
  12. lavas一定是个不错的架构,利用VUE的PWA。是否可以取代APP?
  13. 我的世界Java版最诡异的种子_我的世界:比666还诡异的故障种子,无限复制结构?官方:还是特性...
  14. 办流量卡要身份证照片,办流量卡是否需要身份证正反面照片
  15. 第八节 Electron主进程和渲染进程之间的通信
  16. vmware windows7安装usb3.0驱动
  17. yum安装报错Error: Package,完美解决
  18. 泛在操作系统功能特点
  19. PATA 题解 1002
  20. 百度网盘 for Mac官方版哪里下?来未来软件园

热门文章

  1. 链路层发现协议LLDP
  2. SharePoint2013 App 开发中 自定义网站栏,内容类型,列表。
  3. IBM存储扩展柜磁盘在线扩容(一)
  4. sqlserver2005-error:4064
  5. [转] 在ASP.NET MVC3中使用EFCodeFirst 1.0
  6. 《MySQL必知必会》学习笔记——第七章(数据过滤)
  7. QT、C++面试中的几个问题
  8. java 数据透视表 组件_Apache POI如何将工作簿样式应用于所有数据透视表 . 我如何排除床单?...
  9. C语言线程实例(生产者和消费者),Java多线程:生产者与消费者(1)
  10. python lxml_python – lxml使用命名空间而不是ns0,ns1,