C++ 如何在Dijkstra'中实现优先级队列;s算法

C++ 如何在Dijkstra'中实现优先级队列;s算法,c++,queue,priority-queue,dijkstra,C++,Queue,Priority Queue,Dijkstra,Dijkstra的算法使用一个优先级队列,该队列按距起点的距离排序,但在算法过程中顶点的距离会发生变化。我不确定优先级队列何时重新排序,但如果我有以下比较器: struct compareByDistance { bool operator()(Vertex const &a, Vertex const &b) { return( getDistance(a) < getDistance(b) ); } }; struct compar

Dijkstra的算法使用一个优先级队列,该队列按距起点的距离排序,但在算法过程中顶点的距离会发生变化。我不确定优先级队列何时重新排序,但如果我有以下比较器:

struct compareByDistance
{
bool operator()(Vertex const &a, Vertex const &b)
    {
        return( getDistance(a) < getDistance(b) );
    }  
};
struct compareByDistance
{
布尔运算符()(顶点常量和a、顶点常量和b)
{
返回(getDistance(a)
在算法中,我们只从队列中删除值,所以我无法想象它会完全重新排序。因此,如果距离值发生变化,队列将不符合距离的顺序


如何实现类似于此的功能?

googleminmax(通常为默认)堆,它将作为优先级队列工作。您总是在顶部弹出元素。哪一个将是距离最小的节点。

一个可能的解决方案是使用一个已访问的数组,该数组跟踪找到距离最小的所有节点(即,它们已从队列中弹出一次)。每次从队列中弹出一个项目时,请检查访问的数组以查看是否找到了节点的最短距离。如果是,则忽略该元素。代码如下所示:-

while(!queue.empty())
{
node n1= queue.top();
queue.pop();
if(visited[n1]) continue;

////
//Rest of the code here
////
}

注意:这可能不是最理想的解决方案。

到目前为止你写了什么?这不是一个代码编写服务。@Raedwald当然不是,我想知道一些指导原则或其他非完整的代码。维基百科说应该使用优先级队列,但我找不到如何做到这一点。