我想知道获取(Map + min-Heap)数据结构的简单方法 在C ++中
我试过了:
struct Comp
{
bool operator()(const pair<int,int>& y , const pair<int,int>& z)
{
return (y.second < z.second);
}
};
priority_queue< pair<int,int> , map<int,int> , Comp > p;
现在我遇到的问题是重新初始化,因为它位于priority_queue
我们不能像我们使用maps
一样简单地初始化。
插入元素的唯一方法是
p.push(make_pair(value1,value2));
我还尝试使用简单的地图,而不是将其与priority_queue
一起使用,但问题是当我尝试使用min_element
找到最小元素时,它会返回值而不是键,即这也需要。
请建议以最快的方式执行此问题。 我也相信,有些方法可能超出我的知识范围。
答案 0 :(得分:0)
不,您不能索引优先级队列中的元素来更改值。您必须自己使用changeKey()
操作实现整个优先级队列(顺便说一下,这可以非常优化),或者做一些其他的解决方法。
我已经为Prim算法实现了decreaseKey()
操作的优先级队列来计算最小生成树。如果您想实施优先级排队,那么您可以查看我的回答here或其他一些解决方法,检查Gassa的回答here。
答案 1 :(得分:0)
如果您查看第一条评论,并点击priority_queue文档的链接,那么您将拥有所需的所有工具。
假设您已经在某处定义了边缘。我们说
struct edge {
int vertex1, vertex2;
int weight;
bool operator> (const edge &ref) const {return weight > ref.weight;}
};
你需要一个堆,根据文档应该基于vector或deque。我通常喜欢矢量,但我把deque放在这里只是为了好玩。文档说如果你想要一个小堆,请使用std :: greater,因此你也必须实现edge :: operator&gt;
#include <queue> // std::priority_queue and std::deque
#include <functional> // std::greater
typedef std::priority_queue<edge, std::deque<edge>, std::greater<edge> > djikstra_heap;
现在你可以推动边缘并获得最小值。
edge e1{ 1, 2, 2 };
edge e2{ 1, 3, 4 };
djikstra_heap heap;
heap.push(e1);
heap.push(e2);
edge first_result = heap.top(); heap.pop();