我正在寻找以下问题的解决方案,与最短路径相关。
给定有向图G =(V,E),源s,目标t1,t2,...,tk和行进边{i,j}的成本是cij。现在我想知道从s到t1,...,tk的最短路径。但是,如果使用了椎骨v i (不是源或目标),那么我们有额外的C成本。注意,两条路径使用相同的椎骨vi,成本C只支付一次。
答案 0 :(得分:1)
如果您正在寻找最短路径,并且如果使用c 则每条路径都会受到处罚:
创建修改后的加权函数:
w'(u,v) = w(u,v) + C if v == c
w'(u,v) = w(u,v) otherwise
很容易看出,在dijkstra's algorithm或Bellman Ford运行w'
时,使用c
的任何路径都会被C
严重惩罚,因为如果c
出现在路径中 - 它只出现一次,因此C
会被添加到总权重中[注意c
在最短路径中不能再出现一次],当然还有如果在此路径中未使用c
,则不会受到惩罚。
编辑:我不确定我是否理解正确,如果@SaeedAmiri提到的是正确的话,如果你只想给予惩罚一次[并且最小化路径的总和到t1,...,tk] 然后你应该使用不同的解决方案 - 有类似的想法:
创建加权函数w',使得:
w'(u,v) = w(u,v) + C + epsilon if v == c
w'(u,v) = w(u,v) otherwise
请注意,重要的是epsilon是一个小尺寸,只能在w'上实现,并且是可能的最小尺寸。
w
在图表上运行dijkstra或BF,让我们将权重表示为
W1
w'
在图表中运行dijkstra或BF,让我们将权重表示为W2
W1[ti] == W2[ti]
每个ti∈{t1,...,tk} - 那么您在最短路径中不需要c
,总结果为SUM(W1[ti])
< / LI>
第4步背后的想法是你有两种可能性:
c
- 只会更加广泛 - 因此你可以自由地使用它[并返回W1的总和],并且只加一次惩罚。答案 1 :(得分:0)
标准的O(n ^ 3)动态编程解决方案......
http://en.wikipedia.org/wiki/Dijkstras_algorithm
......仍然有效,只需稍作调整:
只计算直接成本的邻接矩阵,然后迭代考虑快捷方式,但在计算快捷方式的成本时加上vi。
答案 2 :(得分:0)
你还没有准确地告诉我们这个问题到底是什么,但是有一个明确的片段承认了从集合覆盖中保持客观的减少。
对于集合封面的任意实例,设置一个图形,其中包含源,每个集合的顶点以及每个元素的顶点。端子t1,...,tk是元件顶点。每个集顶点具有权重为零的边到源和对应于其元素的顶点。在此图表中,我们必须购买一套机盖,以便从源头到达终端,每套机盖都足够了。
除非你能告诉我们你的实例,否则多项式时间算法的近似比率不会比Theta(log n)好,所以我建议整数编程。