修改Bellman-Ford以支持第二个边缘重量

时间:2016-12-08 03:41:38

标签: c++ algorithm bellman-ford

所以给定初始和最终节点,我需要使用Bellman-Ford alg:

  1. 时找到成本最低的路径
  2. 在特定时间段内剩余

  3. 每条边都有成本和时间/持续时间权重。

    我无法弄清楚如何优化它,可能还有一个优先级队列?我会改变放松功能还是整个程序?

1 个答案:

答案 0 :(得分:0)

这可以通过对Bellman-Ford的略微修改来完成。 像往常一样,外环将运行最多N-1次,其中N是顶点数。

不是将距离存储到源的顶点,而是必须存储每个顶点的距离和时间。 (由下面的disttime表示)

内部循环将略有修改: -

  1. 迭代所有顶点。
  2. 对于每个顶点v,迭代其邻居。
  3. 对于每个邻居u :( Tmax是允许的最长时间)

    if (dist[v] + cost_of_edge[v -> u] < dist[u]) then
        if (time[v] + time_of_edge[v -> u] < Tmax) then
            dist[u] = dist[v] + cost_of_edge[v -> u]
            time[u] = time[v] + time_of_edge[v -> u]
        end if
    end if
    else if (dist[v] + cost_of_edge[v -> u] == dist[u]) then
         if (time[v] + time_of_edge[v -> u] < time[u]) then
             time[u] = time[v] + time_of_edge[v -> u]
         end if
    end if
    
  4. 第一个条件就像普通的贝尔曼一样 - 福特:试图找到u的最小距离,同时确保达到u所花费的时间不超过Tmax。

    第二个if条件是新条件:假设从源到P的路径u,费用为dist[u],并且需要花费时间time[u]。现在让我们说我们找到另一条路径P',它具有相同的费用dist[u],但花费的时间少于time[u] - 我们希望选择此路径,因为这样我们就可以从u

    假设我们不选择路径P',而是选择P,在这种情况下,在算法中,可能还有从u到另一个顶点的路径,比如说x,由于时间限制我们无法考虑。但是,如果选择路径P',则可以考虑此路径,因为遍历P'&lt;遍历P的时间。