Aleph-w  1.5a.2
Biblioteca general de algoritmos y estructuras de datos
 Todo Clases Archivos Funciones Variables 'typedefs' Enumeraciones Amigas Grupos Páginas
archeap.H
1 # ifndef ARCHEAP_H
2 # define ARCHEAP_H
3 
4 # include <tpl_binHeap.H>
5 # include <tpl_graph_utils.H>
6 
7  template <class GT,
8  class Distance,
9  class Access_Heap_Node>
10 class ArcHeap
11  : public BinHeap<typename GT::Arc*, Distance_Compare<GT, Distance>>
12 {
13  Distance & dist;
14  Access_Heap_Node & access_node;
16 
17 public:
18 
19  Distance & get_distance() { return dist; }
20 
21  ArcHeap(Distance & __dist, Access_Heap_Node && acc = Access_Heap_Node())
22  : dist(__dist), access_node(acc), dist_cmp(dist)
23  {
24  // empty
25  }
26 
27  typedef
29 
30  typedef typename Heap::Node Node;
31 
32  void put_arc(typename GT::Arc * arc, typename GT::Node * tgt)
33  {
34  Node *& heap_node = access_node(tgt);
35 
36  if (heap_node == NULL) // ¿existe arco insertado en el heap?
37  { // No ==> crear nuevo nodo para el heap y asignarle arco
38  I(heap_node == NULL); // para ser consistente
39 
40  heap_node = new Node;
41  heap_node->get_key() = arc;
42  this->insert(heap_node);
43 
44  return;
45  }
46 
47  // dos arcos con igual destino ==> tomar menor; descartar mayor
48  typename GT::Arc *& arc_in_heap = heap_node->get_key();
49 
50  // ¿arc_in_heap tiene distancia menor que arc?
51  if (dist_cmp(arc_in_heap, arc))
52  return; // antiguo arco permanece en el heap; nuevo se ignora
53 
54  // arc_in_heap será el arco recién insertado arc
55  arc_in_heap = arc; // cambia el arco
56  this->update(heap_node); // actualiza el heap con el nuevo peso de arc
57  }
58 
59  typename GT::Arc * get_min_arc()
60  {
61  Node * heap_node = this->getMin();
62  typename GT::Arc * arc = heap_node->get_key();
63 
64  // seleccionar nodo que retorne la clase de acceso
65  typename GT::Node * p = (typename GT::Node*) arc->src_node;
66  if (access_node(p) != heap_node)
67  p = (typename GT::Node*) arc->tgt_node;
68 
69  I(access_node(p) == heap_node);
70 
71  access_node(p) = NULL;
72 
73  delete heap_node;
74 
75  return arc;
76  }
77 
78  void empty()
79  {
80  this->remove_all_and_delete();
81  }
82 
83  ~ArcHeap()
84  {
85  empty();
86  }
87 };
88 
89 # endif // ARCHEAP_H
90 
Definition: tpl_graph_utils.H:2102
Definition: tpl_binHeap.H:784
BinHeapNode< Key > Node
El tipo de nodo del heap.
Definition: tpl_binHeap.H:787
Definition: archeap.H:10

Leandro Rabindranath León