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

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  node_pq.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_NODE_PQ_H
  12. #define LEDA_NODE_PQ_H
  13. //------------------------------------------------------------------------------
  14. // node priority queues
  15. //------------------------------------------------------------------------------
  16. #include <LEDA/graph.h>
  17. #include <LEDA/impl/bin_heap.h>
  18. #define PRIO_IMPL bin_heap
  19. #define PRIO_ITEM bin_heap_item
  20. /*{Manpage {node_pq} {P} {Node Priority Queues}}*/
  21. template <class P>
  22. class node_pq : private PRIO_IMPL
  23. {
  24. /*{Mdefinition
  25. An instance $Q$ of the parameterized data type name is a partial
  26. function from the nodes of a graph $G$ to a linearly ordered type $P$
  27. of priorities. The priority of a node is sometimes called the information
  28. of the node. For every graph $G$ only one name may be used and every node
  29. of $G$ may be contained in the queue at most once (cf. section 
  30. ref{Priority Queues} for general priority queues). }*/
  31. int  cmp(GenPtr x, GenPtr y) const { return LEDA_COMPARE(P,x,y); }
  32. int  int_type()              const { return LEDA_INT_TYPE(P); }
  33. void print_key(GenPtr x)     const { LEDA_PRINT(P,x,cout); }
  34. void print_inf(GenPtr x)     const { cout << index(node(x));  }
  35. void clear_key(GenPtr& x)    const { LEDA_CLEAR(P,x); }
  36. void copy_key(GenPtr& x)     const { LEDA_COPY(P,x);  }
  37. public:
  38. /*{Mcreation Q }*/
  39.  
  40. node_pq(const graph& G) { init_node_data(G,1,nil); }
  41. /*{Mcreate creates an instance $Q$ ot type name for the nodes of graph $G$
  42.     with $dom(Q)=emptyset$.}*/
  43. ~node_pq()             { clear(); }
  44. /*{Moperations 1.3 4.7}*/
  45. void insert(node v, P x)
  46. { v->data[1] = PRIO_IMPL::insert(Convert(x),v);}
  47. /*{Mop          adds the node $v$ with priority $x$ to
  48.             var.\ precond $vnotin dom(Q)$.}*/
  49. P prio(node v) const
  50. { return LEDA_ACCESS(P,PRIO_IMPL::key((PRIO_ITEM)v->data[1])); }
  51. /*{Mop         returns the priority of node $v$.}*/
  52. bool member(node v) const {return v->data[1] != nil;};
  53. /*{Mop         returns true if $v$ in var, false otherwise.}*/
  54. void decrease_p(node v, P x)
  55. { PRIO_IMPL::decrease_key(PRIO_ITEM(v->data[1]),Convert(x)); }
  56. /*{Mop          makes $x$ the new priority of node $v$.\
  57.           precond $x le Q$.prio$(v)$.}*/
  58. node find_min() const
  59. { return (node)PRIO_IMPL::inf(PRIO_IMPL::find_min());   }
  60. /*{Mop          returns a node with minimal priority 
  61.                  (nil if var is empty).}*/
  62. void del(node v) 
  63. { PRIO_IMPL::del_item(PRIO_ITEM(v->data[1])); v->data[1] = 0; }
  64. /*{Mop          removes the node $v$ from var. }*/
  65. node del_min()   
  66. { node v = find_min(); PRIO_IMPL::del_min(); v->data[1] = 0;  return v; }
  67. /*{Mop          removes a node with minimal priority from var 
  68.                  and returns it (nil if var is empty).}*/
  69. void clear()     { PRIO_IMPL::clear(); }
  70. /*{Mop          makes $Q$ the empty node priority queue.}*/
  71. int size()   const { return PRIO_IMPL::size(); }
  72. /*{Mop          returns $|dom(Q)|$. }*/
  73. int empty()  const { return PRIO_IMPL::empty(); }
  74. /*{Mop          returns true if var is the empty node
  75.  priority queue, false otherwise.}*/
  76. P inf(node v) const
  77. { return LEDA_ACCESS(P,PRIO_IMPL::key((PRIO_ITEM)v->data[1])); }
  78. /*{Mop         returns the priority of node $v$.}*/
  79. void decrease_inf(node v, P x)
  80. { PRIO_IMPL::decrease_key(PRIO_ITEM(v->data[1]),Convert(x)); }
  81. /*{Xop (for backward compatibility) makes $x$ the new priority of node $v$.\
  82.           precond $p le Q$.prio$(v)$.}*/
  83. };
  84. /*{Mimplementation
  85. Node priority queues are implemented by fibonacci heaps and node arrays.
  86. Operations insert, del_node, del_min take time $O(log n)$, find_min, 
  87. decrease_inf, empty take time $O(1)$ and clear takes time $O(m)$, where 
  88. $m$ is the size of $Q$. The space requirement is $O(n)$, where $n$ is the 
  89. number of nodes of $G$.}*/
  90. #endif