到同一个房间的两条路线,虽然一条更便宜,但它可能已经用掉更多步数。当终点要求恰好经过固定数量的通道时,只保存每个房间一个最小值会丢掉必要信息。
六个房间使用有向正成本通道,可以重复经过房间。第零层只有起点费用零,其他为不可达;下一层只用上一层状态沿一条通道更新,分别保存恰好零至五步的最小费用。
这一例的完整输入
通道格式为起点、终点、成本,完整通道表:[[0, 1, 6], [0, 5, 3], [1, 2, 1], [2, 3, 2], [3, 4, 2], [4, 5, 8], [5, 0, 1], [5, 3, 8]]。
逐项计算记录
精确步数 | 到房间0至5的费用(空为不可达) 0 | [0, None, None, None, None, None] 1 | [None, 6, None, None, None, 3] 2 | [4, None, 7, 11, None, None] 3 | [None, 10, None, 9, 13, 7] 4 | [8, None, 11, 15, 11, 21] 5 | [22, 14, None, 13, 17, 11] 恰好各步数到终点的费用:[None, 3, None, 7, 21, 11]
读表时先把输入与计算后的结果分开。空值表示这一步没有适用对象或没有可用结果,不应自动换成零。编号只负责识别本例中的元素,同一个数字出现在不同字段时,要先确认它代表位置、对象还是数值。
怎样复核和使用
每层代表精确步数而不是最多步数,不能把上一层数值原样复制到下一层。若要计算最多五步,最后再比较各层终点值;不可达状态要保持为空,不能当作费用零。
这份练习没有钥匙条件、负成本或禁止重复房间的限制。若要求简单路径,还需要额外记住访问集合;这里的分层表只解决给定通道图上的步数约束。
可以先遮住记录表,只按上述规则重算前两步,再选择一个边界条件重新试算。若结果不一致,应逐项检查输入顺序、端点是否包含以及状态在哪一步更新;不要只看最终合计相同就认为中间处理也完全正确。
