具有 2 个约束(重量和颜色)的最短路径

Shortest paths with 2 constraints (Weight and Colour)

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

Problem/Algorithm: 我们能否找到 G 的所有 u 条边的最短路径 s-u at most k red edges ?

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

第二种方法: 我们复制 G 图 (G1,G2 ...Gk+1)。为了利用 k 红边约束,当我们使用 Dijkstra 搜索最短路径时,每次我们 "meet" Gi 中的红边 {ui,vi} 时,我们连接 ui在 Gi+1 中有 vi+1。因为 Gk+1 没有任何红边,我们最多只能到达 Gk+1 k edges.But 它失败了。例如,当 k=2 时,如果找到到 X 节点的 2 条红色边最短路径,则不会考虑具有较少红色边的较重路径,这可能会导致未被发现的节点。 (如果我有足够的声誉,我可以 post 一张图片作为例子)。

有什么想法吗?

我认为你的方法实际上是 equivalent,前提是对于方法 #1,你只记录每个节点的每个节点的最短距离使用的边——你不需要记录整个路径(就像你不需要在普通的最短路径问题上为普通的 Dijkstra 记录它一样)

这个方法也不错。特别是,您认为方法 #2 有问题的推理本身就是错误的:对于原始图中的任何节点 X,新图中没有单个对应的节点 X;相反,每个使用的红色边数都有单独的顶点。因此,您正在考虑的两条路径 "to X" 实际上并不指向同一个节点:一条是 (X, 2 red edges used),一条是例如(X,使用了 1 个红色边缘)。然后,您可以使用单个 Dijkstra 运行 计算到每个顶点的所有 k+1 个副本的最短路径(即到每个 0 <= i <= k 和每个 v 的顶点(v,使用的 i 红色边)在 V(G)) 中,return 最低。 (我在这里假设当你写 "Can we find for all u edges of G, the shortest paths s-u" 时,你的意思是 "for all nodes u of G, the shortest paths s-u"。)

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