Dijkstra算法在O((V + E)log W)时间内计算给定源顶点的最短路径

时间:2017-06-12 11:43:21

标签: algorithm graph graph-algorithm shortest-path dijkstra

G(V,E)是具有非负权重函数W的加权有向图:E - > {0,1,2,3,4 ... W}其中W是任何非负整数。我想修改Dijkstra算法来计算O((V + E)log W)时间内给定源顶点s的最短路径。

1 个答案:

答案 0 :(得分:0)

让我们采用带有优先级队列的标准Dijkstra算法并稍微改变一下:

  1. 我们将有一个从int(距离)到矢量的映射,以保持所有顶点具有给定的距离。

  2. 我们将从第一个向量中弹出元素以在每次迭代时获取当前顶点,并在向量变空时删除一个键。

  3. 当我们将元素添加到队列时,我们会将元素推送到相应的向量。

  4. 地图中任何位置最多都有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)实现)。