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

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  p_heap.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_PAIRING_HEAP_H
  12. #define LEDA_PAIRING_HEAP_H
  13. #include<LEDA/basic.h>
  14. // Implementation following John T. Stasko and Jeffrey Scott Vitter
  15. // ( Communications of the ACM   March 1987 Volume 30 Number 3   S. 234-240 )
  16. //
  17. // by Markus Neukirch   (1992)
  18. class ph_item
  19. {
  20.   friend class pairing_heap;
  21.   friend class p_heap;
  22.   friend class p_aux_heap;
  23.         GenPtr key;
  24.         GenPtr inf;
  25.         ph_item* parent;
  26.         ph_item* l_child;
  27.         ph_item* r_child;
  28.         ph_item(GenPtr k,GenPtr i)
  29.         { parent = l_child = r_child=nil;
  30.           key=k;
  31.           inf=i;
  32.          }
  33.        ~ph_item()       {} 
  34.         
  35.   LEDA_MEMORY(ph_item)
  36.         
  37. };
  38. class p_heap
  39. {
  40.         
  41.         ph_item* head;
  42.         int item_count;
  43.         void do_copy(ph_item*,ph_item*,bool);
  44.         void copy_sub_tree(ph_item*, ph_item*);
  45.         void clear_sub_tree(ph_item*);
  46.         ph_item* new_ph_item(GenPtr,GenPtr);
  47.         virtual int cmp(GenPtr, GenPtr) const {return 0; }
  48.         virtual void print_key(GenPtr)  const {}
  49.         virtual void print_inf(GenPtr)  const {}
  50.         virtual void clear_key(GenPtr&) const {}
  51.         virtual void clear_inf(GenPtr&) const {}
  52.         virtual void copy_key(GenPtr&)  const {}
  53.         virtual void copy_inf(GenPtr&)  const {}
  54.  
  55.         virtual int  int_type() const { return 0; }
  56.  
  57. protected:
  58.         //ph_item* comparison_link(ph_item*,ph_item*);
  59.         ph_item* twopass(ph_item*);
  60.         ph_item* multipass(ph_item*);
  61.         ph_item* item(void* p) const { return (ph_item*)p; }
  62.         
  63. public:
  64.         p_heap()        { item_count=0; }
  65.         p_heap(int)     { error_handler(1,"no p_heap(int) constructor");}
  66.         p_heap(int,int) { error_handler(1,"no p_heap(int,int) constructor");}
  67.         p_heap(const p_heap&);
  68.         p_heap& operator=(const p_heap&);
  69. virtual ~p_heap() { clear(); }
  70.         ph_item* insert(GenPtr,GenPtr);
  71.         ph_item* find_min() const { return head; }
  72.         void decrease_key(ph_item*,GenPtr);
  73.         void delete_min_multipass();
  74.         void delete_min_twopass();
  75.         void del_min() { delete_min_twopass(); }
  76.         GenPtr key(ph_item* x) const {return x->key;}
  77.         GenPtr inf(ph_item* x) const {return x->inf;}
  78.         void change_inf(ph_item* x,GenPtr inf)
  79.                 {clear_inf(x->inf);copy_inf(inf);x->inf=inf;}
  80.         void del_item(ph_item* x)
  81.                 {decrease_key(x,head->key);delete_min_twopass();}
  82.         void clear ();
  83.         
  84.         int  size() const  { return item_count; }
  85.         int  empty() const { return item_count>0; }
  86.         // iteration (not yet implemented)
  87.         ph_item* first_item()        const { return 0; }
  88.         ph_item* next_item(ph_item*) const { return 0; }
  89. };      
  90. #endif