如何在Dijkstra算法中实现优先级队列

时间:2013-03-07 12:58:20

标签: c++ queue priority-queue dijkstra

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

struct compareByDistance
{
bool operator()(Vertex const &a, Vertex const &b)
    {
        return( getDistance(a) < getDistance(b) );
    }  
};

在算法中我们只删除队列中的值,所以我无法想象它会完全重新排序。因此,如果距离值发生变化,则队列将不会按距离的顺序排列。

你如何实现它?

2 个答案:

答案 0 :(得分:0)

Google min-max(通常是默认值)堆,它将作为优先级队列。你总是在顶部弹出元素。哪个是距离最小的节点。

答案 1 :(得分:0)

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

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

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

注意:这可能不是最佳解决方案。