Advertisement
Guest User

Untitled

a guest
May 24th, 2017
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.69 KB | None | 0 0
  1. bool compare_heap_elements(PNode n1, PNode n2)
  2. {
  3.     // Compares 2 heap elements, and if they are to be swaped,
  4.     // it also changes their heap indexes
  5.     if (GREATER(n1->dist_time, n2->dist_time)) {
  6.         XCHG(n1->heap_index, n2->heap_index);
  7.         return true;
  8.     }
  9.     if(EQUAL(n1->dist_time, n2->dist_time) &&\
  10.        n1->max_fuel > n2->max_fuel) {
  11.         XCHG(n1->heap_index, n2->heap_index);
  12.         return true;                   
  13.     }
  14.     return false;
  15. }
  16.  
  17. PPath getBestPathByMax(UINT16 max)
  18. {
  19.     // Dijkstra using a heap as Queue
  20.     vector<PNode> Q;
  21.  
  22.     // Due to the need of saving each element heap index, after poping from the heap,
  23.     // each index in the heap will be delayed by one. We keep in heap_delay the number
  24.     // of pop() operations on the heap.
  25.     UINT16 heap_delay = 0;
  26.    
  27.     // We initialize the nodes and the heap.
  28.     nodes[s_node]->parent = NULL;
  29.     nodes[s_node]->visited = true;
  30.     for (UINT16 i = 0; i < nodes.size(); i ++)
  31.         if(i != s_node)
  32.             nodes[i]->visited = false;
  33.     for (UINT16 i = 0; i < nodes[s_node]->neigh.size(); i ++) {
  34.         UINT16 neigh_index = nodes[s_node]->neigh[i]->index;
  35.         nodes[s_node]->neigh[i]->dist_time = log10(t[s_node][neigh_index]);
  36.         nodes[s_node]->neigh[i]->heap_index = i;
  37.         nodes[s_node]->neigh[i]->in_heap = true;
  38.         nodes[s_node]->neigh[i]->max_fuel =\
  39.         nodes[s_node]->neigh[i]->temp_fuel = c[s_node][neigh_index];
  40.         if(nodes[s_node]->neigh[i]->is_key)
  41.             nodes[s_node]->neigh[i]->temp_fuel = 0;
  42.         nodes[s_node]->neigh[i]->parent = nodes[s_node];
  43.         HEAP_INSERT(Q, nodes[s_node]->neigh[i]);
  44.     }
  45.  
  46.     int i = 0;
  47.     while (Q.size()) {
  48.         // We get the next node in the heap. If it's the destination node
  49.         // we break out of the while loop.
  50.         PNode crt_node = Q[0];
  51.         pop_heap(Q.begin(), Q.end(), compare_heap_elements);
  52.         Q.pop_back();
  53.         if(d_node == Q[0]->index)
  54.             break;
  55.         heap_delay ++;
  56.         crt_node->visited = true;
  57.  
  58.         // We check all his neighbours.
  59.         for (UINT16 i = 0; i < crt_node->neigh.size(); i ++) {
  60.             PNode neigh_node = crt_node->neigh[i];
  61.             // The total time to get from the source node to the neigh_node
  62.             // passing trough crt_node.
  63.             double added_dist_time = crt_node->dist_time +\
  64.                                      log10(t[crt_node->index][neigh_node->index]);
  65.             // The total fuel needed to get from the source node to the neigh_node
  66.             // passing trough crt_node.
  67.             UINT16 added_fuel = crt_node->temp_fuel +\
  68.                                 c[crt_node->index][neigh_node->index];
  69.  
  70.             if (\
  71.                 // The best time cost wasn't already decided for this node.
  72.                 !neigh_node->visited &&\
  73.                 // The time is better than any precalculated one.
  74.                 GREATER(neigh_node->dist_time, added_dist_time) &&\
  75.                 // The fuel cost shouldn't get bigger than the max capacity of
  76.                 // our ships.
  77.                 added_fuel <= max
  78.                 )
  79.             {
  80.                 // We update the node.
  81.                 neigh_node->parent = crt_node;
  82.                 neigh_node->dist_time = added_dist_time;
  83.                 neigh_node->max_fuel = MAX(crt_node->max_fuel , added_fuel);
  84.  
  85.                 // We recalculate the built-up fuel cost from the last key or
  86.                 // source planet considering the case the current planet is a key one.
  87.                 if(neigh_node->is_key)
  88.                     neigh_node->temp_fuel = 0;
  89.                 else
  90.                     neigh_node->temp_fuel = added_fuel;
  91.                 // We update our heap.
  92.                 if(neigh_node->in_heap)
  93.                     push_heap(Q.begin(), Q.begin() + neigh_node->heap_index - heap_delay,\
  94.                               compare_heap_elements);                                  
  95.                 else {
  96.                     HEAP_INSERT(Q, neigh_node);
  97.                     neigh_node->heap_index = Q.size() + heap_delay;
  98.                     neigh_node->in_heap = true;
  99.                 }
  100.             }
  101.         }
  102.     }
  103.  
  104.     PPath best_path = new Path;
  105.     PNode crt_node = nodes[d_node];
  106.     while (crt_node != NULL) {
  107.         best_path->push_back(crt_node);
  108.         crt_node = crt_node->parent;
  109.     }
  110.    
  111.     return best_path;
  112. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement