Graph 具有最小优先级队列的Dijkstra算法

Graph 具有最小优先级队列的Dijkstra算法,graph,path,priority-queue,dijkstra,shortest-path,Graph,Path,Priority Queue,Dijkstra,Shortest Path,我试图用优先级队列实现dijkstra算法,但我不明白它是如何工作的。我在网上读了很多指南,但我一点也不懂这个算法 我的问题是:每个节点的优先级是多少?我认为它是具有最小值的传入边的权重,但我不确定。这是真的吗 第二个问题,当我提取队列的根时,如果此节点不与任何已访问的节点相邻,它如何工作?您应该使用优先级队列,其中距离起始顶点最短的顶点将获得最高优先级。最初,所有顶点将具有无穷大的最短距离,起始顶点将具有最短距离0 首先从PQ内的图形插入所有顶点(及其边)。从PQ中删除顶点,并探索其所有边。将

我试图用优先级队列实现dijkstra算法,但我不明白它是如何工作的。我在网上读了很多指南,但我一点也不懂这个算法

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


第二个问题,当我提取队列的根时,如果此节点不与任何已访问的节点相邻,它如何工作?

您应该使用
优先级队列
,其中距离起始
顶点最短的
顶点
将获得最高优先级。最初,所有
顶点
将具有无穷大的最短距离,起始
顶点
将具有最短距离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)
    }
  }
}
初始化图形
初始化pq
pq.insertAll(graph.getVertices())
while(pq不为空){
顶点=pq.remove()
边=顶点。GetEdge()
所有边缘{
destination=edge.getDestination()
newDistance=edge.getLength()+vertex.getDistance()
if(newDistance
麻省理工学院开放式课程链接:


如果你认为Dijkstra的“加权图的广度优先搜索”,它就变得相当容易理解了。回答你的问题:1。不完全是这样-这是最短的边。2.就像BFS一样,如果它不与被访问的节点相邻,那么它还不能完全被访问。如果无法从访问的节点访问到它,它将永远不会被访问。我不明白的一件事是如何跟踪较短的边?在本例中,您似乎只剩下最后的最短距离(
newDistance
),而不是顶点列表?