从LeetCode 210. Course Schedule II 了解拓扑排序

问题简述

给定n节课,每节课按0~n-1编号。
在修某些课的时候需要有其它课的基础,必须先上先修课。现在用pair的形式来表示要先修的课,比如 [ [0,1], [1,2] ] 就表示在修课程1之前必须先修课程0,修课程2之前必须修课程1。现在需要给出一个修课的顺序,使得按照该顺序修课可以顺利得到所有学分。
现在的输入为课程数和先修的顺序,输出为修课顺序中的一种。
比如:

例子1
输入:
2, [[1,0]]
表示共有两门课,在修课程1之前必须修课程0
输出:
[0, 1]
表示修课顺序为0->1

又比如:

例子2
输入:
4, [[1,0],[2,0],[3,1],[3,2]]
输出:
[0,1,2,3] 或者 [0,2,1,3](其中一个即可)

再比如:

例子3
输入:
2, [[1,0], [0,1]]
输出:
[]
因为无法满足修课程1之前修课程0,同时修课程0之前修课程1,所以返回空

解决思路

其实这个问题就是让我们在给定的输入下,判断能否完成拓扑排序。何为拓扑排序(详见这里)?
比如,在输入为

4, [[1,0],[2,0],[3,1],[3,2]]

的情况下,得到的下图1就是一个拓扑排序,也就是一个没有环的有向图。
拓扑排序

图1 拓扑排序示意图
比如改变一下输入 ``` 4, [[1,0],[2,0],[3,1],[3,2],[0,3]] ``` 得到了一个有环图,那么这就不是一个排序了

非拓扑排序

图2 非拓扑排序示意图
很简单吧~接下来只判断给定的输入能否构成拓扑排序,可以的话输出拓扑序列,不可以的话输出空即可。 那么,如何判断呢?这就可以根据入度(indegree)来判断了。所谓入度,就是构成有向图之后,指向各个节点的边数。 具体步骤是,我们每次去掉入度为0的点,将该点加入拓扑排序,同时删去与其连接的边(其它节点的入度会受到影响),直到去掉所有的点为止,如果中途遇到不存在入度为0的点的情况,那么,就认为这个有向图不是拓扑排序的。 比如图1可以如下操作

拓扑排序状态

图3 拓扑排序状态图
而图2中则直接找不到入度为0的点,认为是非拓扑排序。

源代码

下面是一个基于BFS的拓扑排序思路,其实也不能说是严格意义上的BFS,只是有点像~

struct Node{int indegree;vector<int> adjacency;Node(){indegree = 0;adjacency.clear();}
};class Solution {
private:vector<int> res;public:vector<int> findOrder(int numCourses, vector<pair<int, int>>& prerequisites) {vector<Node*> vec;for (int i = 0; i < numCourses; i++){vec.push_back(new Node());}for (int i = 0; i < prerequisites.size(); i++){vec[prerequisites[i].first]->indegree++;vec[prerequisites[i].second]->adjacency.push_back(prerequisites[i].first);}for (int i = 0; i < vec.size(); i++){int j = 0;for (; j < vec.size(); j++){if (vec[j]->indegree == 0){res.push_back(j);vec[j]->indegree = -1;for (int item : vec[j]->adjacency){vec[item]->indegree--;}break;}}if (j == vec.size()){res.clear();return res;}}return res;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/470736.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MongoDb 大数据查询优化、 MongoDB 索引、复合索引、唯一索引、 explain 分 析查询速度

一、索引基础 索引是对数据库表中一列或多列的值进行排序的一种结构&#xff0c;可以让我们查询数据库变得 更快。 MongoDB 的索引几乎与传统的关系型数据库一模一样&#xff0c;这其中也包括一些基本的查询优化技巧。 下面是创建索引的命令&#xff1a; db.user.ensureIndex…

ipconfig不是内部或外部_晶振有什么作用,如何选择合适的晶振,为什么有时候用内部晶振?...

一、 什么是晶振晶振&#xff0c;全名叫"晶体振荡器"&#xff0c;它在电路当中起到产生振荡频率的作用&#xff0c;我们都知道&#xff0c;单片机可以看成是在时钟驱动下的时序逻辑电路&#xff0c;那么这个所需要的时钟就是晶振来产生&#xff0c;可以说它的单片机的…

Mongodb 账户权限配置

Mongodb 账户权限配置 1、第一步创建超级管理用户 use admindb.createUser({ user:admin, pwd:admin, roles:[{role:root,db:admin}] })2、第二步修改 Mongodb 数据库配置文件 默认路径&#xff1a;路径&#xff1a;C:\Program Files\MongoDB\Server\4.0\bin\mongod.cfg 打开…

笔记本电脑关机快捷键_2020年双十一值得入手的高性价比笔记本电脑外设推荐...

本文更新日期&#xff1a;2020.10.21 篇幅较长&#xff0c;请提前收藏关注电脑外设就是除主机外的大部分硬件设备都可称作外部设备&#xff0c;或叫外围设备&#xff0c;简称外设。计算机系统没有输入输出设备&#xff0c;就如计算机系统没有软件一样&#xff0c;是毫无意义的。…

MongoDB 的高级查询 aggregate 聚合管道

一、MongoDB 聚合管道&#xff08;Aggregation Pipeline&#xff09; 使用聚合管道可以对集合中的文档进行变换和组合。 实际项目&#xff1a;表关联查询、数据的统计。 MongoDB 中使用 db.COLLECTION_NAME.aggregate([{<stage>},...]) 方法 来构建和使用聚合管道。 先…

python函数在传参的时候,到底在传些什么?

C这样的语言用多了之后&#xff0c;在Python函数传递参数的时候&#xff0c;经常会遇到一个问题&#xff0c;我要传递一个引用怎么办&#xff1f; 比如我们想要传一个x到函数中做个运算改变x的值&#xff1a; def change(y):y 1x 1 print ("before change:", x) …

android学习笔记五。2、其他组件

一、ContentProvider内容提供者.是是android中一个应用向第三方共享数据的方式,android中的联系人,sms(短信记录)等都是通过这一方式来向外提供的 1、使用&#xff1a; 在应用中使用ContentProvider提供的数据并不是直接使用的,而是需要通过ContentResolver来实现的,ContentRes…

一维条形码识别c语言_条形码的优点

条形码是迄今为止最经济、实用的一种自动识别技术。条形码技术具有以下几个方面的优点A&#xff0e;输入速度快&#xff1a;与键盘输入相比&#xff0c;条形码输入的速度是键盘输入的5倍&#xff0c;并且能实现“即时数据输入”。B&#xff0e;可靠性高&#xff1a;键盘 输入数…

气象数据领航无人飞行器线路优化大赛解决方案(3rd place)

1 队伍介绍 队伍名称&#xff1a;酒后写诗 队伍成员&#xff1a;陈权、林望黎、黄章炜 队伍名次&#xff1a;3 / 1646 2 问题简介 这个问题说起来其实挺简单&#xff08;但实现起来困难重重&#xff09;&#xff0c;就是提供了气象局得到的10个模型的预测数据&#xff08;…

mac最好用的markdown_「建议收藏」PCMaclinux,最好用Markdown编辑器清单

文章很长&#xff0c;不想看&#xff0c;请直接拉到底看简略版清单&#xff01;&#xff01;如果您曾经用Word写过文章&#xff0c;并尝试将文本移动到CMS中(头条、百家号等)&#xff0c;那么您可能已经花费了大量时间&#xff0c;来调整这种跨平台转换导致的格式杂乱。因此&am…

Nodejs 操作 MongoDb 数据库

一、在 Nodejs 中使用 Mongodb 在前面的博文我们给大家讲了如何使用命令操作 Mongodb&#xff0c;这篇博文开始我们给大家讲解一 下如何使用 Nodejs 来操作 Mongodb 数据库 Nodejs 操作 mongodb 数据库官方文档&#xff1a;https://www.mongodb.org.cn/drivers/5.html npm i…

机智的ensemble

1 引言 本文主要结合了李宏毅的机器学习课程之Ensemble和周志华的《机器学习》西瓜书两者的说法&#xff0c;对ensemble这一竞赛利器做了总结。 Ensemble主要可以分为bagging和boosting两种方法。其中&#xff0c;bagging适用于基模型复杂度比较高的情况&#xff08;如树模型…

Linux的sort命令

Linux的sort命令 Linux的sort命令就是一种对文件排序的工具&#xff0c;sort命令的功能十分强大&#xff0c;是Shell脚本编程时常使用的文件排序工具。 sort命令将输入文件看做由多条记录组成的数据流&#xff0c;而记录由可变宽度的字符串组成&#xff0c;以换行符作为定界符。…

delphi 调用php接口_爱站权重查询 API 接口请求调用

爱站权重查询 API 接口在网上已经很多且大都封装成了 API 供别人调用。支持前台跨域请求&#xff0c;以GET/POST方式提交即可。爱站权重查询 API 接口可以查询百度权重、搜狗等级、360权重、神马权重、谷歌等级等&#xff0c;你可以选择调用本站的接口&#xff0c;也可以利用本…

Express 路由、Ejs 、静态文件托管、中间件

一、 Express 简单介绍 Express 是一个基于 Node.js 平台&#xff0c;快速、开放、极简的 web 开发框架&#xff0c;它提供一系 列强大的特性&#xff0c;帮助你创建各种 Web 和移动设备应用。 Express 官网&#xff1a; 英语官网&#xff1a;http://expressjs.com/中文官网…

相邻位数字差值的绝对值不能超过_热点争议中技术问题,伺服控制有几个零点?对应真绝对值多圈编码器意义...

回归技术&#xff0c;把技术问题单独挑出来讲透&#xff0c;争要争个明白&#xff0c;看要看得明白。技术就能越辩越明。如果有“真”与“假”之争&#xff0c;沉默不去争&#xff0c;就是让“真的”受伤&#xff0c;让真心实干的人受伤。伺服控制有三个零点&#xff0c;对应三…

Chapter1-1_Speech_Recognition(Overview)

文章目录1 古人看语音辨识2 什么是语音辨识2.1 输出部分 - Token2.2 输入部分 - 声音信号特征3 数据集4 模型本文为李弘毅老师【Speech Recognition - Overview】的课程笔记&#xff0c;课程视频youtube地址&#xff0c;点这里&#x1f448;(需翻墙)。 下文中用到的图片均来自…

[Swift]loadNibNamed方法

我们自定义UITableViewCell的时候&#xff0c;经常会创建一个xib文件。 &#xff08;注意&#xff1a;选择创建文件要继承于cocoa touch class&#xff0c;而不是cocoa class&#xff0c;否则你是选不了创建xib的&#xff01;&#xff01;&#xff01;&#xff09; 然后我们可以…

Express Cookie 的基本使用

一、Cookie 简介 ● cookie 是存储于访问者的计算机中的变量。可以让我们用同一个浏览器访问同一个域 名的时候共享数据。 ● HTTP 是无状态协议。简单地说&#xff0c;当你浏览了一个页面&#xff0c;然后转到同一个网站的另一个页 面&#xff0c;服务器无法认识到这是同一个…

Chapter1-2_Speech_Recognition(LAS)

文章目录1 内容简述2 模型详述2.1 ListenRNN Encoder1D-CNN EncoderSelf-attentinon EncoderDown Sampling2.2 Attend2.3 Spell2.4 Beam Search2.5 Training2.6 Back to Attention本文为李弘毅老师【Speech Recognition - Listen, Attend, Spell】的课程笔记&#xff0c;课程视…