G(V,E)是具有非负权重函数W的加权有向图:E - > {0,1,2,3,4 ... W}其中W是任何非负整数。我想修改Dijkstra算法来计算O((V + E)log W)时间内给定源顶点s的最短路径。
答案 0 :(得分:0)
让我们采用带有优先级队列的标准Dijkstra算法并稍微改变一下:
我们将有一个从int(距离)到矢量的映射,以保持所有顶点具有给定的距离。
我们将从第一个向量中弹出元素以在每次迭代时获取当前顶点,并在向量变空时删除一个键。
当我们将元素添加到队列时,我们会将元素推送到相应的向量。
地图中任何位置最多都有W + 1
个不同的键。为什么?设v
为当前顶点,d[v]
为其距离。所有小于d[v]
的密钥都已删除。任何未发现的顶点都不在地图中。对于任何已发现的顶点u
d[u] <= d[v] + max_edge_lenght = d[v] + W
。因此,地图中的任何键都必须位于[d[v], d[v] + W]
范围内。
地图的大小为O(W)
,因此每个在O(log W)
时间内工作的操作(推送/弹出向量中的元素为O(1)
)。
当然,只要W
相对较小,它就很有用(否则,您可以使用标准的O((V + E) log V)
实现)。