//heap
int sz = 0;
int heap[maxn];
void push(int x){
int i = sz++;
int p;
while(i > 0){
p = (i - 1) / 2;//父亲节点编号
if(heap[p] <= x) break;//如果已经没有大小颠倒则退出
heap[i] = heap[p];//把父亲节点的数值放下来, 而把自己提上去
i = p;
}
heap[i] = x;
}
int pop(){
int _min = heap[0];//最小值
int last = heap[--sz];//提到根的值
int i = 0;
int a, b;
while(i*2+1 < sz){
a = i * 2 + 1; b = i * 2 + 2;//比较儿子的值
if(b < sz && heap[b] < heap[a]) a = b;
if(last <= heap[a]) break;//如果已经没有大小颠倒则退出
heap[i] = heap[a];//把儿子的数值提上来
i = a;
}
heap[i] = last;
return _min;
}
ACM 优先队列和堆
最新推荐文章于 2020-03-07 18:16:03 发布