首页 > 其他分享 >拓扑排序

拓扑排序

时间:2022-08-17 21:02:05浏览次数:56  
标签:需要 拓扑 入度 任务 完成 条件 排序 我们

拓扑排序

2022.8.16

背景

今天是LAF的生日,在被他的生日赛虐的时候,发现拓扑排序忘得差不多了,赶紧总结一下……

问题

设你有n个任务需要完成,一次只能完成一个任务,完成这些任务时共有m个条件,每条的形式为:第x个任务必须在第y个任务之前完成,求出一种合法的完成任务的方案

解法

对于每一个条件,我们可以把它看作一条从x到y的有向边,表示做完第x个任务后才可以做第y个任务,即第x个任务是开始做第y个任务之前的一个条件
既然我们把所有的条件都转换成了有向边,那么我们就可以建立一个有向图
当然,我们也需要用一个数组记录一下每一个任务完成之前还需要满足的条件数
设d[i]表示第i个任务完成之前还需要满足的条件的数量
不难发现,最开始的d[i]就是点i的入度(不知道入度的可以自行百度)
所以,我们应该从d[i]0的点开始搜索(因为d[i]0时完成第i个任务不需要条件)
我们可以用vis[i]来标记第i个任务是否已完成
第i个任务完成了,对于以完成第i个任务为条件的任务j,它还需要满足的条件的数量是不是d[j]--?
既然d[j]--了,那么d[j]有可能变为0了
也就是说,任务j完成之前需要满足的条件全部被满足了,那么任务j也可以被完成了
现在我们的思路就很清晰了
我们可以用队列来存储已经可以被完成的任务(点)
首先,我们需要读入条件,把它处理成有向边并建图
同时,我们要计算点的入度
接着,我们需要找到入度为0的点,把它们放到队列中
然后,在队列不为空的情况下,我们每次取出一个点,把它标记为已访问
接下来遍历它的出边,把这些点的存入读的数组减一
最后再判断一下这些点的入读是否为0,如果是就加入队列

备注

这是我自己总结的,也有参考别人的总结
有问题请在评论区提出,但请温柔点,谢谢!
转载请注明出处(但我知道我写得很烂,不会有人想转载的,对吧?)
本兔子萌新,请多指教~

标签:需要,拓扑,入度,任务,完成,条件,排序,我们
From: https://www.cnblogs.com/tu4zi3wo1/p/16592905.html

相关文章

  • 字符串大小写规则排序
    输入BadbAbB,输出AaBBbbd。因为A的ascii码比a小,所以相等的时候,直接输出a<b。不相等的时候,如果一个是大写,一个是小写,就要转换之后再比较。 #include<iostream>#include......
  • 亮点4-搜索结果的重新排序采用了本地单页排序和服务端多页排序两种可选模式-《教育行
    《教育行业核心数据流程管理平台》的设计当中,《学生基本信息》管理模块是一个最基本的模块,也是一个十分重要的平台组成部分。它的设计好坏,直接关系到业务管理人员的工作效......
  • Python快速排序
    defquicksort(array):less=[]greater=[]iflen(array)<=1:returnarraypivot=array.pop()forxinarray:ifx<=p......
  • 7-12 排序
    给定N个(长整型范围内的)整数,要求输出从小到大排序后的结果。本题旨在测试各种不同的排序算法在各种数据情况下的表现。各组测试数据特点如下:数据1:只有1个元素;数据2:11个......
  • 经典排序之堆排序
    堆排序思路堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆排序可以说是一种利用堆的概念来排序的选择排序。分......
  • Python 字典排序
    字典是“键-值对”的无序可变序列在实际运用中,对字典进行排序是一个比较常见的操作,主要用到了python内置函数sorted(),该函数可以对所有可迭代的对象进行排序操作。语法(pyth......
  • 排序算法
    1. 排序算法面试中 面试高频又快排、堆排和归并排序先说快排,快排体现的的思想是:分而治之,并且递归 怎么个分呢,选第一个数进行强行将数据分成两拨。此时需要一个函......
  • 排序(王道考研,自用)
    插入排序,折半插入排序,希尔排序冒泡排序快速排序选择排序堆排序归并排序基数排序常考稳定:插入排序,折半插入排序,冒泡排序,归并排序,基数排序不稳定:希尔排序,选择排......
  • antd-vue table 表头同时存在sorter,Slots 排序升序失效“”解决“”
     产品给出的需求是这个客户数同时有提示跟升序于是乎我用了 Slots自定义表头但是发现排序只能降序无法升序 后来发现是排序的事件绑定到了自定义表头上面去了 ......
  • js插入排序
    **插入排序**插入排序主要是将需要排序的数组分为两部分,取第一个元素作为已排序数组,其余元素作为未排序数组,依次取未排序数组的元素和已排序数组中的元素进行对......