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

标签 algorithm graph graph-theory graph-algorithm dijkstra

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

问题/算法:我们能否找到 G 的所有 u 条边,最多有 k 条红色边的最短路径 s-u ?< br/>
第一种方法:我们为每个节点保存具有 0,1...k 条红边的最短路径。我们修改 Dijkstra 算法,并根据我们正在研究的边缘的颜色,分别更新距离。这种方法由于其复杂性而失败。

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

有什么想法吗?

最佳答案

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

这种方法也是合理的。特别是,您关于方法 #2 错误的推理本身就是错误的:对于原始图中的任何节点 X,新图中没有单个对应的节点 X;相反,每个使用的红色边数都有单独的顶点。因此,您正在考虑的“到 X”的两条​​路径实际上并不是到同一个节点:一条是到(X,使用 2 个红色边缘),另一条是到例如(X,使用 1 个红边)。然后,您可以使用单个 Dijkstra 运行来计算到每个顶点的所有 k+1 个副本(即到每个 0 <= i <= k 和 V 中的每个 v 的顶点(v,i 使用的红色边)的最短路径( G)),并返回最低的。 (我在这里假设,当你写“我们能否找到 G 的所有 u 边,最短路径 s-u”时,你的意思是“对于 G 的所有节点 u,最短路径 s-u”。 )

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

关于algorithm - 具有 2 个约束(权重和颜色)的最短路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28241901/

相关文章:

algorithm - 我们如何修改几乎所有算法以获得良好的最佳运行时间?

java - 在无向图中查找所有循环

algorithm - 如何线性排列图形而不重叠?

algorithm - 为什么贪心算法找不到图的最大独立集?

algorithm - 选择具有最大交叉面积的矩形

python - 将文本文件列表的记录打乱到一个文件中

algorithm - 使用邻接矩阵与邻接链表时​​ Dijkstra 算法的时间复杂度

graph - Mathematica ListPlot 中的白色区域

c++ - 如何找到覆盖有向循环图中所有节点的最短路径?

java - 卡格尔算法