当前位置: 首页 > 知识库问答 >
问题:

最小优先级队列Dijkstra算法

奚和光
2023-03-14

我的问题是:每个节点的优先级是什么?我认为它是最小值的传入边缘的权重,但我不确定。这是真的吗?

第二个问题,当我提取队列的根时,如果这个节点不与任何一个被访问的节点邻接,它将如何工作?

共有1个答案

丌官积厚
2023-03-14

您应该使用优先级队列,其中与起始顶点距离最短的顶点将获得最高优先级。最初,所有顶点的最短距离为无穷远,起始的顶点的最短距离为0。

首先从图中插入PQ内的所有顶点(及其)。从PQ中移除顶点,并查看其所有。将最短距离与所有相邻的顶点进行比较,如果任何距离小于当前顶点上的最短距离,则更新PQ中相邻的顶点最短距离。当pq不为空时继续。没有顶点将以无穷远的最短距离结束,因为不可能从起始的顶点“到达它们”。但是,它们仍将从PQ中移除。

伪码

initialize graph
initialize pq
pq.insertAll(graph.getVertices())

while (pq is not empty) {
  vertex = pq.remove()
  edges = vertex.getEdges()

  for all edges {
    destination = edge.getDestination()
    newDistance = edge.getLength() + vertex.getDistance()
    if (newDistance < destination.getDistance()) {
      destination.setShortestDistance(newDistance)
      pq.update(destination)
    }
  }
}

 类似资料:
  • 我在CLRS,第三版(第662页)中读到了Dijkstra的算法。下面是我不明白的书中的一部分: 如果图足够稀疏--特别是-我们可以通过用二进制最小堆实现最小优先级队列来改进算法。 为什么图形应该是稀疏的? 下面是另一部分:

  • 我正在为Dikjstra算法做一个优先级队列。我目前在插入方法上有麻烦。我包含了整个类的代码,以防你需要更好地了解我想完成的事情。我将堆索引放在一个数组列表(heapIndex)中,堆放在另一个数组列表中。 那是我运行程序后的输出(值,优先级,堆索引)。*(-1)表示heapIndex中的空单元格。

  • 有人能帮我找到我的PQ的问题吗?

  • 这是我写的Dijkstra算法的代码: 在这方面我不能理解的工作 这涉及到: < code>()运算符在这里有什么用?我是说它在这段代码中是如何运作的? 还有为什么我们使用

  • 在我实现Dijkstra算法的过程中,我有1个数组(包含所有节点)和1个优先级队列(包含所有节点)。每当一个节点排队时,我都会用新的距离和它来自哪里来更新所有相邻的节点,这样我就可以回溯路径。 优先级队列中的节点更新为新距离,数组中的节点更新为它来自的位置和新距离。当节点出列时,数组中的最终距离会更新: 用前一个节点的信息更新数组和用距离更新优先级队列是否可以接受? 只要找到更好的距离,就会发生这

  • 我一直在努力实现Dijkstra的算法;更具体地,具有优先级队列的部分。将顶点添加到数据结构中,并使用迭代器遍历所有顶点并找到最小距离;这很容易,但这次是。 我想要的是: < li >能够将顶点插入数据结构中 < li >提取(返回并移除)距离dist[v]最小的顶点v 我相信为了让Dijkstra的算法正常工作,你应该能够在恒定时间内插入顶点并在log(n)时间内提取它们;有人建议可以使用优先级