最近刷codeforce时在拓扑排序上发现了一些有趣的东西,在这里记录一下
拓扑排序:根据节点间的连接关系进行线性排序,基础的拓扑排序实现可参考相关博客内容。算法思想:
1:选取满足条件的节点加入队列&栈结构的容器中,
2:对容器中的每个节点,将节点排出容器,
3:将与其相联,且满足一定关系的节点选出加入容器中,
4:重复上述过程直至容器中再无节点,
5:节点进入容器的顺序即为拓扑排序
以上两种实现方法的代码是完全相同的,可这代表两种实现方法的功能也是相同的吗?拓扑排序是一种很好的抽象图的算法,可以以少量的时间复杂度与空间抽取图的关键信息,对于两种实现方法,抽取关键信息的结构是有所不同的,毕竟一个是栈存储中间信息,一个是队列存储中间信息。面对不同的拓扑排序结构,有的结构两种实现方法的拓扑排序功效相同,有的则会不同,所以应用哪种方法实现拓扑排序结构的功能还是要认真考虑的。
------------------------------------------------------------------------------------
题目 :round 656—F. Removing Leaves—2300分
题目大意:给你一棵树(无向图),含有n个子节点,你可以进行如下操作:选择k个叶子节点并删除它们(这k个叶子节点有相同的根,且这些叶节点只与这个根节点相连)【一次性去除多个节点,无法进行则不删除不计入】,问能进行几次这样的操作?
我们把叶节点抽象成普通拓扑排序中的入度为0的节点,树中不断进行删除叶节点,并产生新的叶节点的过程也相当于拓扑排序中的删除入度为0的节点,并将新产生的入度为0的节点纳入计算。
显然此题我们是用队列实现拓扑排序结构的,但如果使用栈,那么就是错误的。
为什么会这样呢,因为此题的贪心策略为队列结构,使用栈存储中间信息,违背了题目结构。
以下图为例:
若应用队列结构存储中间信息,即节点先进先出,则算法迭代顺序为:
一轮: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点,错误。
显然,使用两种数据结构实现拓扑排序功能的侧重与拓扑排序的内部结构是截然不同的。