有两个条件的最短路径问题

时间:2019-01-25 17:05:44

标签: algorithm graph

假设我有一个有向图G(V,E,w,c),其中w是每条边的正权重,c是每条边的成本为1或0.我需要找到一种算法对于给定的源顶点,u查找从u到V中每个成本≤k(其中k≥1)的顶点的最短路径。

我尝试修改Bellman ford的算法,但似乎找不到解决方法。

1 个答案:

答案 0 :(得分:1)

让我重申对问题的理解。

对于成本不超过k的所有顶点,您需要从顶点u到达的最小权重路径。

您需要综合考虑才能实现目标。

假定RouteToNode对象具有以下属性:costweightnodelastRouteToNode和自动递增的id。这是一个链接列表,可将我们带回到原始节点,从而使我们可以重新构造路径。我们先按cost,然后按weight,然后按id比较它们。

我们有一个哈希/字典/无论您要调用什么,它都能将节点映射到到达该节点的权重最低的RouteToNode对象。称为bestRoute

我们有一个todo列表,其中有RouteToNode个尚未处理的列表,它是一个优先级队列,总是返回最小的RouteToNode。请注意,它总是将它们从最低成本返回到最高成本。

我们从bestRoute开始,其中没有任何内容,而一个todo队列只有一个RouteToNode,即:

{
    id: 0,
    cost: 0,
    weight: 0,
    node: u,
    lastRouteToNode: null
}

现在我们执行以下伪代码:

while todo is not empty:
    thisRouteToNode = todo.pop()
    if thisRouteToNode.node not in bestRoute or
      thisRouteToNode.weight < bestRoute[thisRouteToNode.node].weight:
        bestRoute[thisRouteToNode.node] = thisRouteToNode
        for edge adjacent to thisRouteToNode.node:
            construct nextRouteToNode by adding edge
            if nextRouteToNode.cost <= k:
                todo.push(nextRouteToNode)