YC307A [ 20240622 CQYC省选模拟赛 T1 ] 划船(boat)

题意

给定一个有向图 \(G\),以及将所有边反向重连的无向图 \(T\)

你最多可以在 \(T\) 上连续走 \(k\) 条边,走过每条边的代价都为 \(1\),然后 必须\(G\) 的对应点上走一条边以恢复体力。

若当前对应点没有出边,则停留在该点 \(1\) 代价。

求每个点到 \(n\) 的最小代价。

Sol

考虑 \(n\) 作为源点跑 \(\text{bfs}\)

直接上 \(k\) 层图,发现休息不好弄。

集中注意力,假如我们钦定一条边作为最短路径,只要出边不止一条就会增加 \(2\) 的贡献。

但是这个东西假了,因为如果该点出边不存在比当前更差的出边,她还是会走到当前边,这样就变成了 \(1\) 的贡献。

所以我们固然可以考虑休息不用走一条边,只用考虑转移到自己就行了。

直接跑 \(\text{1 - 2 bfs}\) 即可。

但是都做到这里了,不难发现一些事情。

如果我们转移的出边是最后一条出边,根据 \(\text{bfs}\) 的定义,当前时间一定是最大的。

所以当前边是对方点的最后一条出边,直接转移即可,否则记录一下。

最后特判掉在当前停留的情况即可。

posted @ 2024-06-22 17:09  cxqghzj  阅读(47)  评论(0编辑  收藏  举报