【问题标题】:Dijkstra’s algorithm to compute the shortest paths from a given source vertex s in O ((V+E) log W) timeDijkstra 算法在 O ((V+E) log W) 时间内计算从给定源顶点 s 到的最短路径
【发布时间】:2017-06-12 11:43:20
【问题描述】:

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

【问题讨论】:

  • Priority queueMin-heap 结合使用,以提供最小权重的边缘。

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


【解决方案1】:

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

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

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

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

地图中任意点最多有W + 1 不同的键。为什么?设v 为当前顶点,d[v] 为其距离。所有小于d[v] 的键都被删除。任何未发现的顶点都不在地图中。对于任何发现的顶点ud[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) 实现)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-10
    • 2018-05-23
    相关资源
    最近更新 更多