c++映射到最小堆中

c++ map into min heap

本文关键字:映射 c++      更新时间:2023-10-16

我想知道一种简单的方法来获得(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找到最小元素时,它会返回值,而不是这里也需要的键。

请提出解决问题的最快方法。我也相信,在我所知的范围之外,还有一些可能的方法。

否,不能对优先级队列中的元素进行索引以更改值。您要么必须使用changeKey()操作(顺便说一下,这可以非常优化)自己实现整个优先级队列,要么做一些其他变通方法。

我为Prim算法计算最小生成树实现了一个具有decreaseKey()操作的优先级队列。如果你想实现优先级队列,那么你可以在这里查看我的答案,或者在这里查看Gassa的答案。

如果您查看了第一条注释,并按照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>

#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();