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