实现根据条件删除_算法笔记1-拓扑排序拓展-基于栈与队列的不同实现方法的区别...

最近刷codeforce时在拓扑排序上发现了一些有趣的东西,在这里记录一下

拓扑排序:根据节点间的连接关系进行线性排序,基础的拓扑排序实现可参考相关博客内容。算法思想:

1:选取满足条件的节点加入队列&栈结构的容器中,

2:对容器中的每个节点,将节点排出容器,

3:将与其相联,且满足一定关系的节点选出加入容器中,

4:重复上述过程直至容器中再无节点,

5:节点进入容器的顺序即为拓扑排序

3b9c3b7d7f1f9b17155b3d31ec453e8a.png
基于栈实现的拓扑排序

5242a64595027a60ab1b00640cf2745d.png
基于队列实现的拓扑排序

以上两种实现方法的代码是完全相同的,可这代表两种实现方法的功能也是相同的吗?拓扑排序是一种很好的抽象图的算法,可以以少量的时间复杂度与空间抽取图的关键信息,对于两种实现方法,抽取关键信息的结构是有所不同的,毕竟一个是栈存储中间信息,一个是队列存储中间信息面对不同的拓扑排序结构,有的结构两种实现方法的拓扑排序功效相同,有的则会不同,所以应用哪种方法实现拓扑排序结构的功能还是要认真考虑的。

------------------------------------------------------------------------------------

题目 :round 656—F. Removing Leaves—2300分

题目大意:给你一棵树(无向图),含有n个子节点,你可以进行如下操作:选择k个叶子节点并删除它们(这k个叶子节点有相同的根,且这些叶节点只与这个根节点相连)【一次性去除多个节点,无法进行则不删除不计入】,问能进行几次这样的操作?

我们把叶节点抽象成普通拓扑排序中的入度为0的节点,树中不断进行删除叶节点,并产生新的叶节点的过程也相当于拓扑排序中的删除入度为0的节点,并将新产生的入度为0的节点纳入计算。

202bdc96f6ccdd00106403a1995baa18.png
关键代码展示

显然此题我们是用队列实现拓扑排序结构的,但如果使用栈,那么就是错误的。

为什么会这样呢,因为此题的贪心策略为队列结构,使用栈存储中间信息,违背了题目结构

以下图为例:

b7ae70e13af1771def7d764bf67e41d5.png

若应用队列结构存储中间信息,即节点先进先出,则算法迭代顺序为:

一轮:2-5-6-7

二轮:4

三轮:1

若取k为2(一个父节点每有两个儿子节点为叶节点,计数值+1,并删除这两个儿子节点),那么会在计算节点7、4、1时分别得到1点计数值,总计3点。

------------------------------------------------------------------------------

若应用栈结构存储中间信息,即节点先进后出,则算法迭代顺序为:

一轮:7-6

二轮:3-5

三轮:4

四轮:1

若取k为2,那么会在计算节点5、4时分别得到1点计数值,总计2点,错误。

显然,使用两种数据结构实现拓扑排序功能的侧重与拓扑排序的内部结构是截然不同的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值