【问题标题】:Shortest path passing though some defined nodes通过一些已定义节点的最短路径
【发布时间】:2018-04-25 10:55:44
【问题描述】:

在有向图中,找到从 s 到 t 的最短路径,使得该路径通过 V 的某个子集,我们称它们为死亡节点。算法给定一个数 n,当从 s 遍历到 t 时,路径不能通过超过 n 个死亡节点。找到最短路径的最佳方法是什么,她?我正在精简 Dijkstra,但是如何确保我们通过的节点不超过 n 个?请帮助我调整 Dijkstra 以包含此条件。

【问题讨论】:

    标签: algorithm dijkstra


    【解决方案1】:

    小号

    如果 n 很小,您可以制作 n 个图形副本,将它们称为级别 1 到 n。

    你从第 1 层的 s 开始。如果你在一个普通的节点,边会带你到同一层内的节点。如果您处于死亡节点,则边缘会将您带到下一个级别的节点。如果您位于第 n 层的死亡节点,则简单地省略边。

    还将所有级别的 t 个节点连接到一个新的单个目标 T(权重为零)。

    然后计算从s到T的最短路径。

    这种方法的问题是图的大小增加了 n 倍,所以它只适用于小的 n。

    大号

    另一种方法是通过变量 x 增加离开死亡节点的每条边的权重。

    随着变量 x 的增加,最短路径将使用越来越少的死亡节点。调整 x 的值(例如使用二等分法),直到图形仅使用 n 个死亡节点。

    这应该对最短路径进行 O(logn) 次评估。

    【讨论】:

      【解决方案2】:

      我会将途中遇到的死节点的数量作为新的(稀疏)维度添加到计算的距离中——基本上每个节点最多有 n 个最佳距离。

      实现您自己的 BFS 将是类似的:您需要将每个节点的“看到有 x 个死节点”与“看到有 y 个死节点”区别对待,除非途中死节点的总距离和数量是都更小。

      p.s.:如果您对这种方法感到困惑,请发布到目前为止的代码 O:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-04
        • 2016-08-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多