graph - 在具有正节点和负边缘的图形中移动的算法

时间:2017-05-16 17:20:16

标签: algorithm graph pseudocode

我有一个图表,节点中有一些正值,边缘有一些负值。
我必须在图表中精确地x次移动,从源节点到目标节点,目标是最大化总和:

  • 当我留在节点中移动时
  • 当我通过边缘时减法

所以,如果我继续在同一个节点上移动,则总和会增加,所以如果我在一个值为10的节点中停留4次,我总共得到40。一个例子如下图所示。

enter image description here

在这种情况下,最好的解决方案是:

Move1 - > (源节点+3)3

Move2 - > (3-20 + 15)-2

Move3 - > (留+15)13

...(保持同一节点)......

Move19 - > (留+15)253

Move20 - > (目标节点253-5 + 3)251

什么是解决问题的有效解决方案?我可以实现类似伪代码的东西,只是为了理解我该如何解决它。

非常感谢。

1 个答案:

答案 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|之后停止。