所以给定初始和最终节点,我需要使用Bellman-Ford alg:
在
在特定时间段内剩余
每条边都有成本和时间/持续时间权重。
我无法弄清楚如何优化它,可能还有一个优先级队列?我会改变放松功能还是整个程序?
答案 0 :(得分:0)
这可以通过对Bellman-Ford的略微修改来完成。 像往常一样,外环将运行最多N-1次,其中N是顶点数。
不是将距离存储到源的顶点,而是必须存储每个顶点的距离和时间。 (由下面的dist
和time
表示)
内部循环将略有修改: -
对于每个邻居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
第一个条件就像普通的贝尔曼一样 - 福特:试图找到u
的最小距离,同时确保达到u
所花费的时间不超过Tmax。
第二个if条件是新条件:假设从源到P
的路径u
,费用为dist[u]
,并且需要花费时间time[u]
。现在让我们说我们找到另一条路径P'
,它具有相同的费用dist[u]
,但花费的时间少于time[u]
- 我们希望选择此路径,因为这样我们就可以从u
。
假设我们不选择路径P'
,而是选择P
,在这种情况下,在算法中,可能还有从u
到另一个顶点的路径,比如说x
,由于时间限制我们无法考虑。但是,如果选择路径P'
,则可以考虑此路径,因为遍历P'
&lt;遍历P
的时间。