- while(c1 = heap + 2 * (h - heap) + 1,
- c1 < heap_bottom &&
- (c2 = c1 + 1,
- (*c1)->distance_from_source < (*h)->distance_from_source
- ||
- (c2 < heap_bottom && (*c2)->distance_from_source < (*h)->distance_from_source)
- )) {
- if(c2 < heap_bottom && (*c2)->distance_from_source <= (*c1)->distance_from_source) {
- swap(*c2, *h);
- swap((*c2)->heap_slot, (*h)->heap_slot);
- h = c2;
+ while(1) {
+ c1 = heap + 2 * (h - heap) + 1;
+ if(c1 >= heap_bottom) break;
+ c2 = c1 + 1;
+ if((*c1)->distance_from_source < distance_from_source) {
+ if(c2 < heap_bottom && (*c2)->distance_from_source < (*c1)->distance_from_source) {
+ swap((*c2)->heap_slot, heap_slot);
+ swap(*c2, *h);
+ h = c2;
+ } else {
+ swap((*c1)->heap_slot, heap_slot);
+ swap(*c1, *h);
+ h = c1;
+ }