我正在尝试解决一个问题,我需要找到从开始到目标节点的每步最低成本。我认为该算法存在,但是找不到该算法的名称。在我正在处理的情况下,仅存在上升沿,并且可能存在周期。 这不是dijkstra的,因为我不是在寻找最低总成本,而是要寻找代表所有步骤中最高成本的最低成本。
在下面的示例中,此算法将输出3,因为3是该算法可以找到路径的最高最小成本。
因此不是最小成本,因为那样会是4。
*起始节点为灰色,目标节点为绿色。
我认为存在这种算法,我曾尝试在Google上进行搜索,但到目前为止找不到该算法的名称。
答案 0 :(得分:2)
这可以通过对dijkstra进行简单的修改来解决。
Dijkstra的工作方式始终是选择最低成本途径。我们知道,只要在图表中移动时路径成本永不减少(在您的情况下就是如此),我们就会始终按照从最低路径成本到最高路径成本的顺序进行迭代,以找到最佳答案。我们只需要将cost函数修改为每个路径的最大值,然后运行dijkstra。
这是一个伪代码(基本上是python)实现:
import priority_queue
def min_cost_path(start, end):
min_heap = priority_queue([[0, start]]) # queue in form of (cost, node)
visited = set()
while min_heap:
# get lowest weight path thus far
# cost is the lowest cost possible to get to node
cost, node = min_heap.pop()
# optimal path to this node has already been found, ignore this
if node in visited: continue
if node == end: return cost
# this node has been visited
visited.add(node)
# add candidate node-weights to the queue
for weight, neighbor in neighbors(node):
if neighbor not in visited:
min_heap.push((max(weight, cost), neighbor))
return -1 # not possible
答案 1 :(得分:0)
好吧,我只听说过无向图,有向图(如您的示例)这样的问题,我不知道它的调用方式,但不难想出一些有效的解决方法:
我们只能对答案进行二进制搜索,初始搜索空间为 [0,maxWeightInWholeGraph]
在二元搜索的每次迭代中,我们选择一些中间值m
,并且需要检查是否存在从起始节点到目标节点的路径,其边缘权重为<= m
这可以通过简单的BFS来完成,只遍历允许的边缘
现在,如果找到起始目标路径,我们将搜索空间除以选择左半部分的一半,否则选择右半部分。
继续二进制搜索,直到我们收敛为答案为止
此方法的复杂性:O((| V | + | E |)* log2(maxWeightInWholeGraph))