【发布时间】:2018-04-25 10:55:44
【问题描述】:
在有向图中,找到从 s 到 t 的最短路径,使得该路径通过 V 的某个子集,我们称它们为死亡节点。算法给定一个数 n,当从 s 遍历到 t 时,路径不能通过超过 n 个死亡节点。找到最短路径的最佳方法是什么,她?我正在精简 Dijkstra,但是如何确保我们通过的节点不超过 n 个?请帮助我调整 Dijkstra 以包含此条件。
【问题讨论】:
在有向图中,找到从 s 到 t 的最短路径,使得该路径通过 V 的某个子集,我们称它们为死亡节点。算法给定一个数 n,当从 s 遍历到 t 时,路径不能通过超过 n 个死亡节点。找到最短路径的最佳方法是什么,她?我正在精简 Dijkstra,但是如何确保我们通过的节点不超过 n 个?请帮助我调整 Dijkstra 以包含此条件。
【问题讨论】:
如果 n 很小,您可以制作 n 个图形副本,将它们称为级别 1 到 n。
你从第 1 层的 s 开始。如果你在一个普通的节点,边会带你到同一层内的节点。如果您处于死亡节点,则边缘会将您带到下一个级别的节点。如果您位于第 n 层的死亡节点,则简单地省略边。
还将所有级别的 t 个节点连接到一个新的单个目标 T(权重为零)。
然后计算从s到T的最短路径。
这种方法的问题是图的大小增加了 n 倍,所以它只适用于小的 n。
另一种方法是通过变量 x 增加离开死亡节点的每条边的权重。
随着变量 x 的增加,最短路径将使用越来越少的死亡节点。调整 x 的值(例如使用二等分法),直到图形仅使用 n 个死亡节点。
这应该对最短路径进行 O(logn) 次评估。
【讨论】:
我会将途中遇到的死节点的数量作为新的(稀疏)维度添加到计算的距离中——基本上每个节点最多有 n 个最佳距离。
实现您自己的 BFS 将是类似的:您需要将每个节点的“看到有 x 个死节点”与“看到有 y 个死节点”区别对待,除非途中死节点的总距离和数量是都更小。
p.s.:如果您对这种方法感到困惑,请发布到目前为止的代码 O:)
【讨论】: