优先队列和dijkstra

时间:2013-06-07 22:59:00

标签: c++

向我解释如何构建优先级队列以及为什么必须构建这种方式,就好像我对优先级队列的经验的限制是知道队列是什么(我从来没有在我的生活中使用过)。

当我看这个网站时: http://comsci.liu.edu/~jrodriguez/cs631sp08/c++priorityqueue.html

priority_queue<Time, vector<Time>, CompareTime> pq;

我理解时间是这样你有一个时间队列,比较时间决定了时间进入队列的优先级,但为什么vector<Time>需要在构造函数中?< / p>

关于Dijkstra: 我正在将图形实现为节点向量,每个节点包含该向量中所有邻居位置的列表,所以它看起来像这样:

class Node {
  protected:
  string name;
  int value;
  list<int> nodes
}

我如何实现Dijkstra的这一部分:

for each vertex v in Graph:                                
    dist[v] := infinity ;                               
    previous[v] := undefined ;     

对于dist [v] =无穷大,我假设我将每个节点的值设置为无穷大,但是哪个变量允许我这样做?对于之前的[v],undefined是什么意思?

2 个答案:

答案 0 :(得分:3)

在C ++中,int max value可以用作无限

#include <limits>

然后使用

int imax = std::numeric_limits<int>::max();

答案 1 :(得分:3)

它是一个编程练习(Aka你必须必须实施everithing),还是一个真正的程序?

如果是最后一个,请签出标准库优先级队列:http://en.cppreference.com/w/cpp/container/priority_queue

另一方面,如果它真的是一个学习练习,经过一番谷歌搜索,你可以找到:http://pages.cs.wisc.edu/~vernon/cs367/notes/11.PRIORITY-Q.html

我可以为priority_queues实现(Max / Min堆,推/弹操作等)写一个介绍/解释,但那篇论文(我认为)非常好的例子,解释和图片。

编辑:在看到您对我的问题“这是一个练习还是一个真正的计划?”的回答之后。我更喜欢在这里写下完整的答案,并举例说明。

第1步:设置

std::priority_queue有三个模板参数:

  • T :显然,存储在容器中的商品类型。
  • 基础容器:正如其名称所示,是实现中使用的基础容器的类型。其默认值为std::vector<T>
  • Comparer :priority_queue用于比较项目的Functor类。其默认值为std::less<T>(因此,默认情况下, std :: priority_queue是最高优先级队列)。 如果你想要一个最小优先级队列(在你的情况下是Dijkstra的算法),你必须通过一个比较器来做到这一点。通常,您为类型实现二进制operator >,以使std::greater<T>仿函数工作。

第2步:使用std::priority_queue

因此,如果您已完成设置,则可以使用std::priority_queue。它有三个主要操作:

  • push():在piority_queue中插入一个值。
  • pop():移除优先级队列的顶部
  • top():返回对元素的const引用,该元素具有priority_queue中存储的最大值(或最小值,具体取决于您的比较器)优先级。请注意,top()不会删除,而是 pop()的工作。

实施例

#include <queue>
#include <iostream>

//User defined type. For this short example, a simple uint wrapper:
struct Foo
{
    unsigned int i;

    Foo(unsigned int _i) : i(_i) {}
};

//Implementation of operator> for class Foo, to make std::greater<Foo> work:
bool operator>(const Foo& f1 , const Foo& f2)
{
    return f1.i > f2.i;
}

int main()
{
    std::priority_queue<Foo,std::vector<Foo>,std::greater<Foo>> foo_min_priority_queue;

    foo_min_priority_queue.push(Foo(2));
    foo_min_priority_queue.push(Foo(1));
    foo_min_priority_queue.push(Foo(0));

    std::cout << foo_min_priority_queue.top().i << std::endl; //Prints 0 
    foo_priority_queue.pop();

    std::cout << foo_min_priority_queue.top().i << std::endl; //Prints 1 
    foo_min_priority_queue.pop();

    std::cout << foo_min_priority_queue.top().i << std::endl; //Prints 2 
    foo_min_priority_queue.pop();

    return 0;
}

参考文献: