Vertex **c1, **c2, **h;
// omg, that's beautiful
h = heap_slot;
- while(c1 = heap + 2 * (h - heap + 1) - 1, c2 = c1 + 1,
- (c1 < heap + heap_size && (*c1)->distance_from_source < (*h)->distance_from_source)
- ||
- (c2 < heap + heap_size && (*c2)->distance_from_source < (*h)->distance_from_source)
- ) {
- if(c1 < heap + heap_size &&
- !(c2 < heap + heap_size && (*c2)->distance_from_source < (*c1)->distance_from_source)){
- swap(*c1, *h);
- swap((*c1)->heap_slot, (*h)->heap_slot);
- h = c1;
- } else {
+ while(c1 = heap + 2 * (h - heap) + 1,
+ c1 < heap + heap_size &&
+ (c2 = c1 + 1,
+ (*c1)->distance_from_source < (*h)->distance_from_source
+ ||
+ (c2 < heap + heap_size && (*c2)->distance_from_source < (*h)->distance_from_source)
+ )) {
+ if(c2 < heap + heap_size && (*c2)->distance_from_source <= (*c1)->distance_from_source) {
swap(*c2, *h);
swap((*c2)->heap_slot, (*h)->heap_slot);
h = c2;
+ } else {
+ swap(*c1, *h);
+ swap((*c1)->heap_slot, (*h)->heap_slot);
+ h = c1;
}
}
}
void force_positivized_lengths();
// Visit the vertices according to _dp_order and simply update their
- // distance to the source
+ // distance from the source
void dp_compute_distances();
// Set in every vertex pred_edge_toward_source correspondingly to