您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

每日推演-5月17日,课程二

2022/6/19 7:31:15发布76次查看
每日推演:5月17日,课程二
话题描述:每天5月17日的一个话题。主题链接:/problems/course-schedule-ii/
现在你总共有n门课程可以选择,记录为0到n-1。在学习某些课程之前,需要一些先决课程。例如,如果您想学习第0课,您需要先完成第1课,我们使用一个匹配来表示它们:
给定课程总数及其先决条件,返回到您已安排完成所有课程的学习顺序。
解决问题的思路和主题使用拓扑排序算法的组合理解。那么什么是拓扑排序呢?
在图论中,当且仅当满足以下条件时,由有向无环图的顶点组成的序列可以称为图的拓扑排序:
每个顶点都包含在序列中,每个顶点只出现一次;
如果序列中的a在b之前,那么图中没有从b到a的路径。
如何找到拓扑排序?下图显示了一个有向图。我们将度数定义为边所指的点数,那么下图中的度数为。显然,当进入度为0时,课程可以在没有先决条件的情况下直接学习。
学习0号课程后,以0号课程为前提的课程(即节点可以到达的节点)的入口减少1。此时,新添加节点的渗透率变为0;选择1或2作为学习节点。继续更新...直到所有的节点都被选择并且所有的课程都被学习。详细过程如下所示。(绿色节点是指度数为0的节点)
有向图、、、]
ans=可以通过重复更新过程来解决。如果这个拓扑过程不能继续,但没有不能更新的numcourse节点,这意味着找不到有效的课程(图中有课程)。
复杂性o(n+m)时间复杂性o(n+m)。n是课程数,m是所有课程的前提条件数。复杂度为0(n+m),介于空,辅助图像存储。
代码(第三版。)类解决方案:
定义查找顺序(自身,数值范围:整数,先决条件:列表[列表[整数]]) ->列表[int]:
indegree = [0] * numcourses
m = {x:列表()中的x在范围内(numcourses)}
对于先决条件中的配对:
indegree[pair[0]] += 1
m[对[1]]。追加(对[0])
i = 0
ans = []
当我& ltnumcourses:
如果不一致[i]:
ans.append(i)
i += 1
i = 0
当我& ltlen(ans):
对于m[ans[i]]中的x:
indegree[x] -= 1
如果不一致[x]:
ans.append(x)
i += 1
如果数值== len(ans):
返回ans
否则:
返回[]
这就是解决方案的结局。这个周末我太忙了,没有时间再多呆一天,每天做五顿大餐来招待我的表弟。他终于答应让我暂时养他的小猫。这个星期,他是一个猫主人。
(*^▽^*)
(*^▽^*)
(*^▽^*)
文章来源:www.atolchina.com
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product