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

时间:2015-01-30 18:00:14

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

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

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

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

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

我认为你的方法实际上是等价的,前提是对于方法#1,你只记录每个节点的的最短距离 - 你不需要记录整个路径(正如你不需要在普通的最短路径问题上为普通的Dijkstra记录它)

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

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