prio.h
上传用户:gzelex
上传日期:2007-01-07
资源大小:707k
文件大小:4k
开发平台:

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  prio.h
  6. +
  7. +  Copyright (c) 1995  by  Max-Planck-Institut fuer Informatik
  8. +  Im Stadtwald, 66123 Saarbruecken, Germany     
  9. +  All rights reserved.
  10. *******************************************************************************/
  11. #ifndef LEDA_PRIORITY_QUEUE_H
  12. #define LEDA_PRIORITY_QUEUE_H
  13. #include <LEDA/impl/f_heap.h>
  14. typedef f_heap_item pq_item;
  15. /*{Manpage {priority_queue} {K,I} {Old-Style Priority Queues}}*/
  16. template<class K, class I> 
  17. class priority_queue: private f_heap
  18. {
  19. /*{Mdefinition
  20. An instance $Q$ of the parameterized data type name is a
  21. collection of items (type $pq_item$). Every item contains a key from type
  22. $K$ and an information from the linearly ordered type $I$. $K$ is called the
  23. key type of $Q$ and $I$ is called the information type of $Q$. The number of
  24. items in $Q$ is called the size of $Q$. If $Q$ has size zero it is called the
  25. empty priority queue. We use $<k,i>$ to denote a $pq_item$ with key $k$ and
  26. information $i$.
  27. The type name is identical to the type $p_queue$ except that the meanings
  28. of $K$ and $I$ are interchanged. We now believe that the semantics of
  29. $p_queue$ is the more natural one and keep name only for historical 
  30. reasons. We recommend to use $p_queue$ instead.}*/
  31. int  int_type()              const { return LEDA_INT_TYPE(I); }
  32. int  cmp(GenPtr x, GenPtr y) const { return LEDA_COMPARE(I,x,y); }
  33. void clear_key(GenPtr& x)    const { LEDA_CLEAR(I,x); }
  34. void clear_inf(GenPtr& x)    const { LEDA_CLEAR(K,x); }
  35. void copy_key(GenPtr& x)     const { LEDA_COPY(I,x); }
  36. void copy_inf(GenPtr& x)     const { LEDA_COPY(K,x); }
  37. void print_key(GenPtr x)     const { LEDA_PRINT(I,x,cout); }
  38. void print_inf(GenPtr x)     const { LEDA_PRINT(K,x,cout); }
  39. public:
  40. /*{Mcreation Q }*/
  41. priority_queue()  {}
  42. /*{Mcreate 
  43. creates an instance var of type name and initializes it with the
  44. empty priority queue. }*/
  45.  priority_queue(const priority_queue<K,I>& Q):f_heap(Q) {}
  46. ~priority_queue()  { f_heap::clear(); }
  47. priority_queue<K,I>& operator=(const priority_queue<K,I>& Q) 
  48. { return (priority_queue<K,I>&)f_heap::operator=(Q); }
  49. /*{Moperations 2 5.5}*/
  50. virtual K key(pq_item it) const { return LEDA_ACCESS(K,f_heap::inf(it)); }
  51. /*{Mop     returns the key of item $it$.\
  52.             precond $it$ is an item in var.}*/
  53. virtual I inf(pq_item it) const { return LEDA_ACCESS(I,f_heap::key(it)); }
  54. /*{Mop     returns the information of item $it$.\
  55.     precond $it$ is an item in var.}*/
  56. virtual pq_item insert(K k, I i) 
  57.                               { return f_heap::insert(Convert(i),Convert(k)); }
  58. /*{Mop     adds a new item $<k,i>$ to var and returns it.}*/
  59. virtual pq_item find_min() const { return f_heap::find_min();}
  60. /*{Mop     returns an item with minimal information 
  61.     (nil if var is empty).}*/
  62. virtual K   del_min() 
  63. { K x = key(find_min()); f_heap::del_min(); return x; }
  64. /*{Mop    removes the item $it$ = var.find_min() from var
  65.    and returns the key of $it$.\
  66.            precond var is not empty.}*/
  67. virtual void del_item(pq_item it) { f_heap::del_item(it); }
  68. /*{Mop    removes the item $it$ from var.\
  69.    precond $it$ is an item in var.}*/
  70. virtual void change_key(pq_item it, K k) 
  71. { f_heap::change_inf(it,Convert(k)); }
  72. /*{Mop    makes $k$ the new key of item $it$.\
  73.    precond $it$ is an item in var.}*/
  74. virtual void decrease_inf(pq_item it, I i)
  75. { f_heap::decrease_key(it,Convert(i)); }
  76. /*{Mop     makes $i$ the new information of item $it$.\
  77.     precond $it$ is an item in var and $i$
  78.     is not larger then $inf(it)$.}*/
  79. virtual int  size()    const { return f_heap::size(); }
  80. /*{Mop     returns the size of var.}*/
  81. virtual bool empty()   const { return (size()==0) ? true : false; }
  82. /*{Mop     returns true, if var is empty, false otherwise}*/
  83. void clear() {f_heap::clear();}
  84. /*{Mop     makes var the empty priority queue. }*/
  85. virtual pq_item first_item() const { return f_heap::first_item(); }
  86. virtual pq_item next_item(pq_item it) const { return f_heap::next_item(it); }
  87. };
  88. /*{Mimplementation
  89. Priority queues are implemented by Fibonacci heaps cite{FT87}. Operations
  90. insert, del_item, del_min take time $O(log n)$, find_min, decrease_inf, 
  91. key, inf, empty take time $O(1)$ and clear takes time $O(n)$, where $n$ is the 
  92. size of var. The space requirement is $O(n)$.}*/
  93. /*{Mexample
  94. Dijkstra's Algorithm (cf. section ref{Graph and network algorithms})}*/
  95. #endif