题解:P10533 [Opoi 2024] 热核武器
这题我们可以分成三个部分来解,得到框架代码。
part1
目标:把输入的数据转化成图。
直接按题意模拟即可。
part1 代码
part2
目标:求出
实现:题目要求这个城市走到首都的最小道路数,因为
方法1:Floyd 算法。
这个算法代码很简洁,并且复杂度为
Floyd 算法的流程:
- 定义
b_{i,j} 为从点i 到点j 的最短路径。 - 对于每一个节点
k ,检查b_{i,k}+b_{k,j}<b_{i,j} 是否成立,如果成立就令b_{i,j}=b_{i,k}+b_{k,j} 。
part2 Floyd 算法代码
方法2:Dijkstra 算法。
如过你想优化复杂度,那么这个方法非常合适,因为它的时间复杂度上限只有
Dijkstra 算法的流程:
- 先初始化
dis_{0}=0 ,其它为无穷大。 - 找一个最小的
dis_{i} ,此时dis_{i} 已经是最小的,所以不可能有别的路径可以更新dis_{i} 。 - 找到所有与点
i 连接的点j ,如果通过这个点的路径更短,更新dis_{j} 为dis_{i}+i 到j 的距离。 - 如果全部点都访问完毕,跳出循环,否则回到第 2 步。
part2 Dijkstra 算法代码
part3
目标:判断是否存在把
实现:可以用 01 背包,背包的花费和价值都是
part3 代码
AC 代码