【发布时间】: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