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

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  partition.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_PARTITION_H
  12. #define LEDA_PARTITION_H
  13. //------------------------------------------------------------------------------
  14. // partition   (union find)
  15. //------------------------------------------------------------------------------
  16. #include <LEDA/basic.h>
  17. /*{Manpage {partition} {} {Partitions} }*/
  18. class partition_node {
  19. /*{Mdefinition
  20. An instance  $P$ of the data type $partition$ consists of a finite set of
  21. items ($partition_item$) and a partition of this set
  22. into blocks.}*/
  23. friend class partition;
  24. partition_node* father;
  25. partition_node* next;
  26. int size;
  27. GenPtr info;
  28. public:
  29. partition_node(GenPtr x, partition_node* n)  
  30.   father=0; size=1; info=x; next = n; 
  31.  }
  32.   LEDA_MEMORY(partition_node)
  33. };
  34. // a partition item is a pointer to a partition node:
  35. typedef partition_node* partition_item;
  36. class partition {
  37. virtual void clear_inf(GenPtr&) const {}
  38. partition_item used_items;                 // List of used partition items
  39. public:
  40. /*{Mcreation P }*/
  41. partition() { used_items = 0; }  
  42. /*{Mcreate creates an instance $P$ of type $partition$ and initializes it to 
  43.             the empty partition.}*/
  44. virtual ~partition() { clear(); }
  45. /*{Moperations 3 4}*/
  46. partition_item make_block(GenPtr x) 
  47. { used_items = new partition_node(x,used_items); 
  48.   return used_items; 
  49.  }
  50. partition_item make_block() 
  51. { return make_block(nil);
  52. }
  53. /*{Mopl      returns a new $partition_item$ $it$ and adds
  54.      the block ${it}$ to partition $P$.}*/
  55. partition_item find(partition_item p);
  56. /*{Mopl     returns a canonical item of the block that
  57.      contains item $p$, i.e., if $P$.same_block($p,q$)
  58.      then $P$.find($p$) = $P$.find($q$).\
  59.      precond $p$ is an item in $P$. }*/
  60. bool  same_block(partition_item p, partition_item q) 
  61. { return find(p)==find(q); }
  62. /*{Mopl      returns true if $p$ and $q$ belong to the same
  63.       block of partition $P$.\
  64.       precond $p$ and $q$ are items in $P$.}*/
  65. void  union_blocks(partition_item p, partition_item q);
  66. /*{Mopl      unites the blocks of partition $P$ containing
  67.      items $p$ and $q$.\
  68.      precond $p$ and $q$ are items in $P$.}*/
  69. GenPtr   inf(partition_item a) { return find(a)->info; }
  70. void  set_inf(partition_item a, GenPtr x) { find(a)->info = x; }
  71. void clear();                      // deletes all used items
  72. partition_item first_item() const  { return used_items;  }
  73. partition_item next_item(partition_item it) const  { return it->next; }
  74. };
  75. /*{Mimplementation
  76. Partitions are implemented by the union find algorithm with weighted union
  77. and path compression (cf.~cite{T83}).  Any sequence of $n$ make_block and 
  78. $m ge n$ other operations takes time $O(malpha(m,n))$.}*/
  79. /*{Mexample
  80.     Spanning Tree Algorithms (cf. section ref{Graph Algorithms}).}*/
  81. //------------------------------------------------------------------------------
  82. // PARTITION  (named partitions)
  83. //-----------------------------------------------------------------------------
  84. template <class E>
  85. class PARTITION : public partition {
  86. void clear_inf(GenPtr& x) const { LEDA_CLEAR(E,x); }
  87. public:
  88. partition_item make_block(E x) { return partition::make_block(Copy(x)); }
  89. E  inf(partition_item a)       { return (E)partition::inf(a); }
  90. void  set_inf(partition_item a, E x) { partition::set_inf(a,Copy(x)); }
  91.  PARTITION() {}
  92. ~PARTITION() {}
  93. };
  94. #endif