这里的关键是理解“动态编程”只是指对于某个函数f(x),对于某些不同的输入x重复执行f会导致不同的结果或执行路径。从这个定义出发,我们可以把缓存看作是动态编程的一个实例。
所以让我们从一个没有动态编程的实现开始。使用回溯,我们可以先执行深度(这在以后会很重要)一组从s开始到T结束的遍历。
let P(a,b) be a path from a->b
let w(p) be the total weight of some path p
let K be the exhaustive set of P(s,t) // a.k.a every path that exists
// Returns Max(p) p ∈ K
function findMaxPath(G)
return findMaxPath(s)
// Returns Max(P(n, t))
function findMaxPath(n)
if (n === t)
return an empty path // we are already at the target
declare p = null
for each e of n // every outgoing edge
let q = G(n, e)
let l = findMaxPath(q) // get the maximum path from the neighbor indice to t
if (l == null) continue
l = e + l // prepend the outgoing end to the max path of the child node
if (w(l) > w(p)) p = l // this is most expensive outgoing end that eventually reaches t
return p // return null if we can't reach t
这个解决方案的问题是它真的很慢。特别是,您最终会重新计算很多路径。以下图为例:
let P(a,b) be a path from a->b
let w(p) be the total weight of some path p
let K(n) be the exhaustive set of P(n,t) // a.k.a every path that exists
let C be a cache of Max(w(p)) p ∈ K(n)
// Returns Max(w(p)) p ∈ K(s)
function findMaxPath(G)
return findMaxPath(s)
// Returns Max(P(n, t))
function findMaxPath(n)
if exists C[n]
return C[n] // we already know the most expensive path from n->t
if (n === t)
return an empty path // we are already at the target
declare p = null
for each e of n // every outgoing edge
let q = G(n, e)
let l = findMaxPath(q) // get the maximum path from the neighbor indice to t
if (l == null) continue
l = e + l // prepend the outgoing end to the max path of the child node
if (w(l) > w(p)) p = l // this is most expensive outgoing end that eventually reaches t
C[n] = p
return p // return null if we can't reach t
我试图将这个问题概念化,然后为它编写Java代码。我知道这里有一些讨论,但我没有看到很多回答者,所以我想通过写下我的想法来重申这个问题,我希望从你们那里得到一些反馈。谢谢 我的想法:对于每个叶节点,找到从根节点到它的最长路径。对于所有路径,找到最大路径长度 然而,这不就是蛮力吗,对此还有更优雅的解决方案吗? 我听说过使用Djikstra的负权重算法,但在某些地方它说这只适用于特定情况?我也看到了关
给出了一个图G=(V,E),它是正加权的,有向的,无圈的。我设计了一个在O(k(m+n))中运行的算法,用于报告从s到T的k-边最短路径。k-边最短路径定义为从s到t的具有k条边的路径,并且对于从s到t的所有路径,该路径的总权也必须是最小的。 由于BFS不能单独用于寻找最短路径(除非权重相等),我认为运行时间意味着使用BFS寻找具有k条边的路径。让我感到困惑的是k,因为我认为它意味着表演BFS k
你有一辆2005年本田雅阁,油箱里还剩50英里(最大重量)。在50英里半径范围内,你可以访问哪些麦当劳的位置(图节点)?这是我的问题。 如果你有一个加权有向无环图,你如何找到在给定的权限制内可以访问的所有节点? 我知道Dijkstra的算法,但我似乎找不到任何关于它在最小路径问题之外的用途的文档。在我的例子中,我们没有特别想结束的节点,我们只想在不超过最大权重的情况下尽可能多地结束。似乎您应该能够
在一个加权有向图中,我需要找到两个结点s,t之间的最短路径。以下是限制: 权重可以为负值。 路径必须经过一个特定的边,让我们从节点u到V调用her e和shes。 输出路径必须简单,即我们只通过一个节点一次。 因为我希望它最短,所以我将检查在从s到u之前从v到t运行bellman ford是否比相反的方式更快(如果有节点,两个节点都使用where是放置它的最佳位置)。 谢谢你的帮助!
我遇到了一个问题,我必须找出给定图形中的最长路径。我有一个边列表(例如,{AB,BC}),它表明在顶点/节点(A,B,C)之间有一条边。现在我想计算出可能的最长路径(不重复顶点),这样它可以覆盖从任何顶点/节点开始的最大节点。 解决这个问题的最佳方法是什么?我必须把它作为一个计划来实施。 我在谷歌上查找最小生成树、Dijkstra的算法等等。但我想不出什么最适合解决这个问题。 任何帮助或阅读参考资
给我一个图中名为“a”的顶点,对于v中的每一个v,我需要找到从a到v的路径的权重,它在时间O(v+E)中权重最低。我不得不只使用BFS或DFS(尽管这很可能是BFS的问题)。 我想过要制作一个新的图,其中边为0的顶点是统一的,然后在它上面运行BFS,但是这会破坏图的方向(如果图是无向的或者权重是{2,1},对于边为2,我会创建一个新的顶点)。 如果有任何帮助,我将不胜感激。 谢谢