我有一个图表,节点中有一些正值,边缘有一些负值。
我必须在图表中精确地x
次移动,从源节点到目标节点,目标是最大化总和:
所以,如果我继续在同一个节点上移动,则总和会增加,所以如果我在一个值为10的节点中停留4次,我总共得到40。一个例子如下图所示。
在这种情况下,最好的解决方案是:
Move1 - > (源节点+3)3
Move2 - > (3-20 + 15)-2
Move3 - > (留+15)13
...(保持同一节点)......
Move19 - > (留+15)253
Move20 - > (目标节点253-5 + 3)251
什么是解决问题的有效解决方案?我可以实现类似伪代码的东西,只是为了理解我该如何解决它。
非常感谢。
答案 0 :(得分:1)
这可以通过Bellman-Ford algorithm的变体来解决,O(|E|*n)
时间复杂度,其中|E|
是边数,n
是步数:
为简单起见,假设您在每个节点中都有一个自循环,权重为0,这表示"保持操作"。所以你有:
for all u in V:
(u,u) in E
w(u,u) = 0
现在,使用Dynamic Programming:
应用递归公式D[v][0] = 0 if v is the source
-infinity otherwise
D[v][i] = max { D[u][i-1] + w(u,v) + cost(v) | where (u,v) is an edge }
解决方案是D[target][n]
这基本上是Bellman-Ford算法(使用max
而不是min
),但是在n
次迭代后而不是在|V|
之后停止。