信友队 CSP-S2023 C

发布时间 2023-10-20 09:52:32作者: ydtz

首先考虑路径形态,发现应为,从当前所在关键点出发,经过若干已走到的关键点,到达一个未走过的关键点,重复 \(\ge t\) 次,回到初始关键点。由于路径成环,故起点可以为环上的任意一个节点。

\(f(t)\) 表示至少经过 \(t\) 个关键点的答案,\(g(t)\) 为恰好经过 \(t\) 个关键点的答案,则求出 \(g(t)\) 即可得到 \(f(t)\)

而如果我们将答案路径的每一段拆开,只考虑从关键点开始,不经过任何其它关键点,到达另一关键点的距离,这个显然是可以通过跑 \(c\) 遍 dijkstra 求出的。然后我们的流程便为:从当前已走过的关键点集合中选择一个点,走过去,以该点为起点走到一个未走过的关键点,加入集合,进行 \(t\) 次。

由于还需要知道起点的位置,所以设置 \(0/1\) 的状态表示当前是否到达过起点,dijkstra 的时候也顺便处理下(不)经过起点的最小贡献即可。剩下的东西可以通过状压 dp 来做,向已走过关键点集合中的点走的过程做一遍 \(O(c^2)\) 暴力 dijkstra 即可。

时间复杂度 \(O(cm\log m+2^cc^2)\)

考虑形态,简化原图,正权的转移图可以考虑跑 dijkstra 处理。