【问题标题】:Shortest paths with 2 constraints (Weight and Colour)具有 2 个约束(重量和颜色)的最短路径
【发布时间】:2015-01-30 18:00:13
【问题描述】:

输入: 我们有一个有向图 G=(V,E),每条边都有一个权重和一个颜色 {red,green}。我们还给出了一个起始节点 s。

问题/算法:我们能否找到 G 的所有 u 个边,最短路径 s-u 最多有 k 个红色边?

第一种方法:我们为每个节点保存具有 0,1...k 个红色边的最短路径。我们修改了 Dijkstra 的算法,并根据我们正在查看的边缘的颜色,分别更新距离。这种方法由于其复杂性而失败。

第二种方法:我们制作 G 图的 k 个副本(G1,G2 ...Gk+1)。为了利用 k 个红边约束,当我们用 Dijkstra 搜索最短路径时,每次我们在 Gi 中“遇到”红边 {ui,vi} 时,我们将 ui 与 Gi+1 中的 vi+1 连接起来。因为 Gk+1 没有任何红边,我们只能到达 Gk+1 最多有 k 条边。但是它失败了。例如,在 k=2 的情况下,如果找到到 X 节点的 2 条红色边最短路径,则不会考虑红色边较少的较重路径,这可能导致未发现的节点。 (如果我有足够的声誉,我可以发布一张图片作为示例)。

有什么想法吗?

【问题讨论】:

  • 我认为您的方法实际上是等效的,并且它们(两者)都是合理的。特别是,您认为方法#2 错误的推理本身就是错误的:对于原始图中的任何节点 X,新图中都没有单个对应的节点 X;相反,每个使用的红色边数都有单独的顶点。因此,您正在考虑的两条路径实际上并不是到同一个节点:一条是到(X,使用 2 个红色边缘),另一条是到例如(X,使用了 1 个红边)。
  • 我的意思是,如果对于方法#1,对于使用的每个红色边数,您只记录 到每个节点的最短距离,则这些方法是等效的。你不需要记录整个路径(就像你不需要为普通的 Dijkstra 记录一个普通的最短路径问题一样)。
  • 所以我可以将我复制的任何新节点视为一个新节点,我应该单独检查。在算法结束时,为了找到最短路径,我应该检查与相同初始节点对应的每个重复节点?
  • 是的。您还需要确保对于 G 中的任何红色边 {u, v},您删除所有 Gi 的相应边 {ui, vi}(以及添加边 {ui, vi+1})。您可能有意这样做,但您并没有明确说明。
  • 谢谢先生,你帮了我很多。我希望我能给你声誉:D

标签: algorithm graph graph-theory graph-algorithm dijkstra


【解决方案1】:

我认为您的方法实际上是等效的,前提是对于方法 #1,您只记录 与每个节点的最短距离 使用的每个红色边数 - 您不需要记录整个路径(就像普通最短路径问题上的普通 Dijkstra 不需要记录一样)

这种方法也很合理。特别是,您认为方法#2 错误的推理本身就是错误的:对于原始图中的任何节点 X,新图中都没有单个对应的节点 X;相反,每个使用的红色边数都有单独的顶点。因此,您正在考虑的“到 X”的两条​​路径实际上并不是到同一个节点:一个是到(X,使用了 2 个红色边缘),一个是到例如(X,使用 1 个红边)。然后,您可以使用单个 Dijkstra 运行来计算每个 0 节点 u,最短路径 s-u”。 )

最后,您需要确保对于 G 中的任何红色边 {u, v},删除所有 Gi 对应的边 {ui, vi}(以及添加边 {ui, vi+1 })。您可能有意这样做,但您没有明确说明。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-21
    • 1970-01-01
    • 1970-01-01
    • 2017-08-17
    • 2016-05-28
    • 2021-12-08
    相关资源
    最近更新 更多