LG P2483 【模板】k短路([SDOI2010]魔法猪学院)

该文主要探讨了如何求解以n为根的最短路径树,并在此基础上,重新定义非树边的权值,形成新的路径。通过归并策略,将边序列分类,并找出每类的最小值方案,以求得第k小的路径。文章介绍了如何利用优先队列和分治策略,不断删除最小路径并分裂类别,最终优化算法以解决这个问题。
摘要由CSDN通过智能技术生成

题目
首先求出以 n n n为根的最短路径树。
非树边 i i i的权值重置为: c s t [ i ] + d i s [ f r o m [ i ] ] − d i s [ t o [ i ] ] cst[i]+dis[from[i]]-dis[to[i]] cst[i]+dis[from[i]]dis[to[i]]
那么选非树边 i i i就代表从 f r o m [ i ] from[i] from[i] t o [ i ] to[i] to[i]走这条边,而非最短路径树上的边。
那么我们需要能够组成一个边序列使得其构成一个合法的路径。
求出第k小的路径。
考虑归并。
如果我们可以把所有的边序列分成几个类,并且求出每个类的最小值方案,那么最小的路径就是每个类的最小值方案中的最小值。
考虑第二小,发现第一小的路径已经失去了竞争资格。
那么删去第一小的路径后,如果第一小路径的那一类会变成一个或多个类使得每个类没有交集,他们的并集只是之前的那一类除去第一小路径,那么我们就可以把那一类分裂成这几类从而达到删除第一小路径的目的。
继续执行求最小值等过程即可推至第k小路径。
对于这个题,一开始的类为以边 i i i为路径上第一条非树边的路径。
显然每个类的最小值方案就是只有 i i i这一条非树边。
然后删去只选 i i i的方案,我们可以分裂成第一条是 i i i,第二条是 j j j那些类。
那么每一类的最小值其实就是已经确定的边的和。
我们只需要快速求多个类的最小值。
用优先队列即可实现,每次拿出队头,再将拓展后的放入。
发现拓展十分费时。
改一下拓展方案。
第一条是 i i i且不只有 i i i 分裂成:第一条是 i i i第二条是 i i i后能接的最小的边 j j j的路径且不只有 i i

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值