ABC 414 (F)
F
需要特别注意的地方:这道题中的一次走 \(K\) 条边需要保证与初始点距离也为 \(K\)。而原图是一棵树,因此等价于在走的过程中,不可以经过之前走的那条边。所以本题在进行动态规划转移时,需要针对这一点添加限制。(如果走 \(K\) 条边不需要保证距出发点距离恰好为 \(K\),那就相当于无限制地在图上游走,那么求到达每个点的最短路,直接 \(bfs\) + 分层图 即可解决)
此题需要将无向图看作有向图,为每个边编号,并将每条边作为转移对象。对于每条边的转移,只需要限制到其反向边的转移即可,非常方便。
而需要注意的是,以边为转移对象的复杂度是 \(O(n^{2}k)\) 的,这与点之间的转移不同(点是 \(O(nk)\))。因为点之间的状态转移是“一对多”,而边是“多对多”,具体可以自己模拟一下。
剩下的题解参考这篇博客即可,讲得非常清晰:blog
这道题需要注意的是时间复杂度的分析:虽然总状态数是 \(O(nk)\) 的,但实际转移却需要 \(O(d^{2}k)\) 次,因此会 \(TLE\)。而 \(bfs\) 保证了第一次转移即为最优转移,故只要保证了 \(2\) 次转移后覆盖到了所有转移即可,之后的转移便可直接跳过。至此将复杂度降至 \(O(2dk)\)。