P9370 APIO2023 赛博乐园 / cyberland

博客详细解析了APIO2023赛博乐园问题,如何利用分层图和Dijkstra算法求解最短路,涉及优惠策略的处理和100分解决方案,包括对优惠政策的理解、多源最短路的应用以及对算法复杂度的分析。
摘要由CSDN通过智能技术生成

P9370 APIO2023 赛博乐园 / cyberland

题目就是让我们求一个有各种优惠政策的单源点 \(0\),单汇点 \(H\) 的最短路。优惠政策是:

  • 到达能力为 \(2\) 的点,可以让之前走过的距离除以 \(2\)
  • 到达能力为 \(0\) 的点,可以让之前走过的距离直接变成 \(0\)

有限制:不能经过 \(H\) 多次。那其实也就是说,\(H\) 只能作为答案路径的终点,不能作为路径的途经点。

优惠政策最短路,再加上 97 分中 \(K\) 的限制为 \(K \le 30\)优惠政策能使用的次数很低

上面加粗的两句正是分层图最短路的两条重要特征。于是想到建立 \(K\) 层的分层图,来解决“除以 \(2\)”这个优惠政策。

这里默认读者已经学会分层图,若不会,请先学习并完成分层图模板:JLOI2011 飞行路线。这里还有分层图题单,供读者练习。

原图为第 \(0\) 层图,总共建立 \(K +1\) 层图(编号 \(0 \sim K\)),第 \(p\) 层的点 \(u\) 代表之前使用优惠恰好 \(p\) 次,到达点 \(u\) 的状态。我们记其为 \((p, u)\)。设它的最短路为 \(\mathrm{dis}(p, u)\)

最短路算法必须使用 dijkstra,用 spfa 虽然可以通过原题的数据,但复杂度是错的,讨论区中有 hack 数据。

定义 \(w(u, v)\) 为原图上 \(u\)\(v\) 两点之间的边权。如果 \(u\)\(v\) 两点之间没相连接的边则 \(w(u, v)\) 未定义。

思路一

首先想一下,到达能力为 \(0\) 的点可以清空最短路,那其实就相当于从这个点开始走。

因此,我们将所有能从 \(0\) 出发,不途径 \(H\) 到达的,能力同时为 \(0\) 的点看做源点,跑多源最短路即可。

那么能力为 \(0\) 就解决了,现在只需要解决能力 \(2\)

考虑在 dijkstra 枚举出边时进行如下松弛:

  • 尝试用 \(\mathrm{dis}(p, u) + w(u, v)\) 更新
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值