【问题标题】:How to implement the priority queue in Dijkstra's algorithmDijkstra算法中如何实现优先级队列
【发布时间】:2013-03-07 12:58:20
【问题描述】:

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

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

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

你如何类似地实现它?

【问题讨论】:

  • 到目前为止你写了什么?这不是代码编写服务。
  • @Raedwald 当然不是,我想知道一些指导方针或任何不是完整的书面代码。维基百科说应该使用优先队列来完成,但我找不到这样做的方法。

标签: c++ queue priority-queue dijkstra


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    while(!queue.empty())
    {
    node n1= queue.top();
    queue.pop();
    if(visited[n1]) continue;
    
    ////
    //Rest of the code here
    ////
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多