我有以下定义:
struct vertex {
int number;
bool mixed = false;
vertex(int n):number(n){};
bool operator > (const vertex & v)const{
return d[this->number] > d[v.number];
}
使用
priority_queue<vertex, vector<vertex>, greater<vertex> >q
调试之后,我发现队列未按预期排序(遵循数组 d 的顺序)。我想知道为什么。在处理期间, d 的服务器时间被修改。
答案 0 :(得分:1)
由于d
的订购过程中使用了priority_queue
,因此一旦开始向队列中添加内容,就无法对其进行更改。这样做可能会更改队列中包含的对象的顺序,并且会破坏用于priority_queue
的比较所需的严格弱排序。
此外,priorty_queue
中的元素没有完全排序,因为它是使用heap实现的。
答案 1 :(得分:1)
如前所述,如果x
已经存储在priority_queue
中,并且您修改了d[x]
,则将破坏数据结构。
一个明显的解决方案是删除元素,更改d
,然后放回原处。
AFAIK,priority_queue
不允许删除随机访问,因此您可以使用set
。 set.begin()
返回最低元素。
void update(int x, int v) {
set.erase(x);
d[x] = v;
set.insert(x);
}
int getMin() {
return *set.begin();
}