【问题】现在你总共有 n 门课需要选,记为 0 到 n-1。

在选修某些课程之前需要一些先修课程。例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1]

给定课程总量以及它们的先决条件,判断是否可能完成所有课程的学习?

示例 :
输入: , [[,]]
输出: true
解释: 总共有 门课程。学习课程 之前,你需要完成课程 。所以这是可能的。
示例 :
输入: , [[,],[,]]
输出: false
解释: 总共有 门课程。学习课程 之前,你需要先完成课程 ;并且学习课程 之前,你还> 应先完成课程 。这是不可能的。
说明:

输入的先决条件是由边缘列表表示的图形,而不是邻接矩阵。详情请参见图的表示法。
你可以假定输入的先决条件中没有重复的边。

【思路】由于本题目中的每个课程之间都有相应的联系,因此我们可以根据课程关系来构建一个有向图,如果在这个有向图中存在一个循环,那么则不能学完所有的课程,因为每个课程都需要每个先决条件的课程。一个很简单的思路是使用拓扑排序算法,可以判断一个循环是否存在于一个有向图中。

拓扑排序算法:计算图中所有节点的入度,如果某些节点的入度为零,则压入到队列todo中,接着循环弹出队列中的节点(即入读为零的节点),同时将下一个节点中入度为零的节点压入队列中,如果最后图都可以分离开,也就在此过程中,每个节点在分离时都可能入度为零。说明这个有向图中没有循环,否则则有循环。

拓扑排序
bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
std::unordered_map<int, int> indegree;
for(auto& v : prerequisites) {
indegree[v[]]++;
}
queue<int> que;
for(int i=; i<numCourses; ++i) {
if(indegree[i] == ) {
que.push(i);
}
}
int cnt = ;
while(!que.empty()) {
int k = que.front();
que.pop();
cnt++;
for(auto& v : prerequisites) {
if(k == v[]) {
if(--indegree[v[]] == ) {
que.push(v[]);
}
}
}
}
if(cnt != numCourses)
return false;
return true;

最新文章

  1. 基于MVC4+EasyUI的Web开发框架经验总结(14)--自动生成图标样式文件和图标的选择操作
  2. SET TEXTSIZE number
  3. spring3.2.8+quartz2.2.0(比较全,对比quartz1.x的配置)
  4. idea tomcat +eclipse式的部署
  5. js判断IE6(推荐方法一)
  6. leetcode344——Reverse String(C++)
  7. 你了解JS执行过程吗?
  8. java.lang.RuntimeException: Method called after release()
  9. jQuery 3D canvas 旋转木马(跑马灯)效果插件 - cloud carousel
  10. 【第五篇】androidEventbus源代码阅读和分析之发送粘性事件和接收粘性事件代码分析
  11. Windows API 之 GetModuleHandle
  12. JavaScript 创建一个 form 表单并提交
  13. 总结MySQL大数据量下如何进行优化
  14. 花点时间顺顺Git(上)
  15. swift 加载 本地html 和 网络路径
  16. mac 全角/半角标点符号切换
  17. 一、PHP_OSS使用
  18. nine
  19. BCP IN示例
  20. SlickSafe.NET 开源权限框架开发指南

热门文章

  1. Ubuntu基于Apache为自己的网站开启HTTPS
  2. JS:利用for循环进行数组去重
  3. css3的伪(伪类和伪元素)大合集
  4. POJ 3090 欧拉函数
  5. FPGA调试技巧(Quartus 15.1 Standard平台)
  6. Django(十)模型:django模型类对数据库的:增/删/改/查、自关联、管理器、元选项(指定表名)
  7. Django(五)1 - 4章实战:从数据库读取图书列表并渲染出来、通过url传参urls.py path,re_path通过url传参设置、模板语法
  8. UVA - 10305 Ordering Tasks(拓扑排序)
  9. 第四篇:Vue的项目开发
  10. 【问题管理】-- Tomcat8部署项目加载静态资源html页面编码错误