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

标签 algorithm graph pseudocode

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

  • 当我停留在一个节点中进行移动时
  • 通过边时的减法

所以,如果我在同一个节点停留移动,总和会增加,所以如果我在值为 10 的节点停留 4 次,我总共获得 40。下图是一个示例。

enter image description here

在这种情况下最好的解决办法是:

Move1 -> (源节点+3) 3

移动 2 -> (3-20+15) -2

Move3 -> (stay +15) 13

...(保持相同的节点)...

Move19 -> (stay +15) 253

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

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

非常感谢。

最佳答案

这可以通过 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|.

关于algorithm - 图 - 在具有正节点和负边的图形中移动的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44007817/

相关文章:

algorithm - 使用 FFT 和 IFFT 计算 (x^2 + 1)^3

javascript - 计算纵横比的算法是什么?

c# - 哪种图遍历算法适合这种情况

jquery - 如何在 Chart.js 中的图形工具提示中附加更多数据

c - 使用 openMP 任务时出现意外行为

计算依赖图偏序的算法

c++ - 高效的子阵列 (2D) 访问

algorithm - 什么是用于试验简单解释器的简单垃圾收集算法?

python - 贝尔曼福特负重量 - Networkx

algorithm - 计算机编程艺术中approximatelyEqual和essentiallyEqual的区别