28template <
class C>
class heap {
36 unsigned &index (
unsigned e) {
39 unsigned &res = pos[e];
44 bool has_parent (
unsigned e) {
return index (e) > 0; }
45 bool has_left (
unsigned e) {
46 return (
size_t) 2 * index (e) + 1 <
size ();
48 bool has_right (
unsigned e) {
49 return (
size_t) 2 * index (e) + 2 <
size ();
52 unsigned parent (
unsigned e) {
54 return array[(index (e) - 1) / 2];
57 unsigned left (
unsigned e) {
59 return array[2 * index (e) + 1];
62 unsigned right (
unsigned e) {
64 return array[2 * index (e) + 2];
69 void exchange (
unsigned a,
unsigned b) {
70 unsigned &i = index (a), &j = index (b);
71 swap (array[i], array[j]);
77 void up (
unsigned e) {
79 while (has_parent (e) && less ((
p = parent (e)), e))
85 void down (
unsigned e) {
86 while (has_left (e)) {
87 unsigned c = left (e);
89 unsigned r = right (e);
106#warning "expensive checking in heap enabled"
108 for (
size_t i = 0; i < array.size (); i++) {
109 size_t l = 2*i + 1, r = 2*i + 2;
110 if (l < array.size ())
CADICAL_assert (!less (array[i], array[l]));
111 if (r < array.size ())
CADICAL_assert (!less (array[i], array[r]));
118 for (
size_t i = 0; i < pos.size (); i++) {
127 heap (
const C &c) : less (c) {}
131 size_t size ()
const {
return array.size (); }
135 bool empty ()
const {
return array.empty (); }
140 if ((
size_t) e >= pos.size ())
149 size_t i = array.size ();
152 index (e) = (unsigned) i;
169 unsigned res = array[0], last = array.back ();
171 exchange (res, last);