Cosmetics.
[mtp.git] / mtp_graph.cc
index c17917e..a03f60e 100644 (file)
@@ -97,36 +97,40 @@ void Vertex::del_leaving_edge(Edge *e) {
 
 void Vertex::decrease_distance_in_heap(Vertex **heap) {
   Vertex **p, **h;
-  // There is some beauty in that
   h = heap_slot;
-  while(h > heap &&
-        (p = heap + (h - heap + 1) / 2 - 1,
-         (*p)->distance_from_source > (*h)->distance_from_source)) {
+  while(1) {
+    if(h <= heap) break;
+    p = heap + ((h - heap + 1) >> 1) - 1;
+    if((*p)->distance_from_source <= distance_from_source) break;
+    swap((*p)->heap_slot, heap_slot);
     swap(*p, *h);
-    swap((*p)->heap_slot, (*h)->heap_slot);
     h = p;
   }
 }
 
 void Vertex::increase_distance_in_heap(Vertex **heap, Vertex **heap_bottom) {
   Vertex **c1, **c2, **h;
-  // omg, that's beautiful
   h = heap_slot;
-  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;
+      }
     } else {
-      swap(*c1, *h);
-      swap((*c1)->heap_slot, (*h)->heap_slot);
-      h = c1;
+      if(c2 < heap_bottom && (*c2)->distance_from_source < distance_from_source) {
+        swap((*c2)->heap_slot, heap_slot);
+        swap(*c2, *h);
+        h = c2;
+      } else break;
     }
   }
 }
@@ -271,6 +275,7 @@ void MTPGraph::dp_compute_distances() {
 // pred_edge_toward_source.
 
 void MTPGraph::find_shortest_path() {
+  int heap_size;
   Vertex *v, *tv, **last_slot;
   Edge *e;
   scalar_t d;
@@ -280,20 +285,20 @@ void MTPGraph::find_shortest_path() {
     _vertices[k].pred_edge_toward_source = 0;
   }
 
-  _heap_size = _nb_vertices;
+  heap_size = _nb_vertices;
   _source->distance_from_source = 0;
   _source->decrease_distance_in_heap(_heap);
 
-  do {
+   while(heap_size > 1) {
     // Get the closest to the source
     v = _heap[0];
 
     // Remove it from the heap (swap it with the last_slot in the heap, and
     // update the distance of that one)
-    _heap_size--;
-    last_slot = _heap + _heap_size;
+    heap_size--;
+    last_slot = _heap + heap_size;
     swap(*_heap, *last_slot); swap((*_heap)->heap_slot, (*last_slot)->heap_slot);
-    _heap[0]->increase_distance_in_heap(_heap, _heap + _heap_size);
+    (*_heap)->increase_distance_in_heap(_heap, last_slot);
 
     // Now update the neighbors of the node currently closest to the
     // source
@@ -301,13 +306,13 @@ void MTPGraph::find_shortest_path() {
       d = v->distance_from_source + e->positivized_length;
       tv = e->terminal_vertex;
       if(d < tv->distance_from_source) {
-        ASSERT(tv->heap_slot - _heap < _heap_size);
+        ASSERT(tv->heap_slot < last_slot);
         tv->distance_from_source = d;
         tv->pred_edge_toward_source = e;
         tv->decrease_distance_in_heap(_heap);
       }
     }
-  } while(_heap_size > 0);
+  }
 }
 
 void MTPGraph::find_best_paths(scalar_t *lengths) {