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

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  f_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_FHEAP_H
  12. #define LEDA_FHEAP_H
  13. //------------------------------------------------------------------------------
  14. //
  15. // Fibonacci Heap
  16. //
  17. // Michael Muth  (1988)
  18. //
  19. // Modifications
  20. //
  21. // - virtual compare function  (Stefan Naeher, August 1989)
  22. //
  23. // - virtual clear functions   (Stefan Naeher, April 1990)
  24. //
  25. //------------------------------------------------------------------------------
  26. #include <LEDA/basic.h>
  27. class f_heap_node  {
  28. // repraesentiert Knoten und Heap geordnete Baeume
  29. friend class f_heap;
  30.    f_heap_node* next;          // used to link all used items 
  31.    f_heap_node* pred;          
  32.    f_heap_node* left;          // left and right siblings (circular List)
  33.    f_heap_node* right;   
  34.    f_heap_node* parent;        // parent node
  35.    f_heap_node* children;      // a child
  36.    int  rank;                   // number of children
  37.    char mark;                   // ( 1=true, 0=false )
  38.    GenPtr key;                  // key
  39.    GenPtr inf;                  // information
  40. // size: 10 words =  40 bytes
  41.    void link(f_heap_node*);
  42.    void cut(f_heap_node*);
  43. public:
  44.    f_heap_node(GenPtr k, GenPtr i, f_heap_node* n) 
  45.    {  key = k;
  46.       inf = i;
  47.       next = n;
  48.       pred = 0;
  49.       rank = 0;
  50.       mark = 0;
  51.       parent = 0;
  52.       children = 0;
  53.       if (n) n->pred = this;
  54.     }  // end of f_heap_node()
  55.   LEDA_MEMORY(f_heap_node)
  56.  };  //f_heap_node
  57. typedef f_heap_node* f_heap_item;
  58. class f_heap
  59.  /* Ein F-Heap enthaelt eine zirkulaere Liste von Heap geordneten
  60.     Baeumen. Der Einstieg erfolgt ueber den minptr, einen Zeiger
  61.     auf den Baum mit kleinstem Schluessel in der Wurzel. Die ei-
  62.     gentlichen Items ( Paare aus NxT ) sind in den Knoten der
  63.     Baeume enthalten.                                               */
  64.  { 
  65.    int node_count;         // number of nodes
  66.    f_heap_node* minptr;    // entry to the List of roots
  67.    f_heap_node* node_list; // List of all nodes
  68.    int max_rank() const;
  69.    f_heap_node* new_f_heap_node(GenPtr k, GenPtr i)
  70.    { return  node_list = new f_heap_node(k,i,node_list); }
  71.    virtual int cmp(GenPtr, GenPtr) const { return 0; }
  72.    virtual void print_key(GenPtr)  const {}
  73.    virtual void print_inf(GenPtr)  const {}
  74.    virtual void clear_key(GenPtr&) const {}
  75.    virtual void clear_inf(GenPtr&) const {}
  76.    virtual void copy_key(GenPtr&)  const {}
  77.    virtual void copy_inf(GenPtr&)  const {}
  78.    virtual int  int_type() const { return 0; }
  79. protected:
  80.   f_heap_node* item(void* p) const { return (f_heap_node*)p; }
  81. public:
  82.  f_heap();
  83.  f_heap(const f_heap&);
  84.  f_heap& operator=(const f_heap&);
  85. virtual ~f_heap()  { clear(); }
  86. f_heap_node* insert(GenPtr, GenPtr);
  87. f_heap_node* find_min() const { return(minptr); }
  88. void del_min();  
  89. void decrease_key(f_heap_node*,GenPtr);
  90. void change_inf(f_heap_node*,GenPtr);
  91. void del_item(f_heap_node *x){ decrease_key(x,minptr->key); del_min();}
  92. void clear();
  93. GenPtr  key(f_heap_node *x) const { return x->key ; }
  94. GenPtr  inf(f_heap_node *x) const { return x->inf; }
  95.   
  96. int  size()  const { return node_count; }
  97. int  empty() const { return (find_min()==0) ? true : false; }
  98. // Iteration:
  99. f_heap_node* first_item() const;
  100. f_heap_node* next_item(f_heap_node* p) const;
  101. };  // end of class f_heap
  102. // dummy I/O and cmp functions
  103. inline void Print(const f_heap&, ostream&) { }
  104. inline void Read (f_heap&, istream&) { }
  105. inline int  compare(const f_heap&,const f_heap&) { return 0; }
  106. #endif