繁体   English   中英

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

[英]How to implement the priority queue in Dijkstra's algorithm

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

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

在算法期间,我们仅从队列中删除值,因此我无法想象它会完全重新排序。 因此,如果距离值更改,则队列将不会按距离顺序排列。

您如何与此类似地实施它?

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM