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

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  tree_collection.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_DYNTREES_H
  12. #define LEDA_DYNTREES_H
  13. #include <LEDA/basic.h>
  14.  /*********************************************************************
  15.  *                                                                     *
  16.  *  dyna_trees T; deklariert eine (vorerst leere) Menge von dyn_trees  *
  17.  *                                                                     *
  18.  *  d_vertex T.maketree(); Erzeugt einen Baum, der genau einen Knoten  *
  19.  *     enthaelt (der in keinen anderem Baum enthalten ist.             *
  20.  *                                                                     *
  21.  *  d_vertex T.findroot(d_vertex v); Gibt die Wurzel des v enthaltenden*
  22.  *     Baumes zurueck.                                                 *
  23.  *                                                                     *  
  24.  *  d_vertex T.findcost(d_vertex v, double& d); Gibt den entsprechenden*
  25.  *     Knoten zurueck (s.o.), die Kosten werden im Argument d zurueck- *
  26.  *     gegeben.                                                        *
  27.  *                                                                     *
  28.  *  void   T.addcost(d_vertex v, double x); s.o.                       *
  29.  *                                                                     *
  30.  *  void   T.link(d_vertex v, d_vertex w); s.o.                        *
  31.  *                                                                     *
  32.  *  void   T.cut(d_vertex v); s.o.                                     *
  33.  *                                                                     *
  34.  *                                                                     *
  35.  * Implemented by Jan Timm                                             *
  36.  *                                                                     *
  37.  *********************************************************************/
  38. class d_node;
  39. typedef d_node *d_vertex;
  40. typedef d_node *d_path;
  41. class d_node {
  42. friend class dyna_trees;
  43.      void*    info;        // user-defined information
  44.      d_vertex left,        // linkes Kind
  45.               right,       // rechtes Kind
  46.               parent,      // Elter
  47.               successor,   // Nachfolger (fuer Pfad)
  48.               next;        // fuer Verkettung fuer ~dyna_tree
  49.      double dcost,
  50.             dmin;
  51.      d_node(void* i) { 
  52.                        left=right=parent=successor=next=0;
  53.                        dcost=dmin=0;
  54.                        info = i;
  55.                       };
  56.    LEDA_MEMORY(d_node)
  57. };
  58.   
  59.    
  60. class dyna_trees {
  61.      d_vertex first,
  62.             last;  // diese beiden Zeiger fuer ~dyna_tree
  63.      void splay(d_vertex);
  64.      d_vertex assemble(d_vertex, d_vertex, d_vertex);
  65.      void   disassemble(d_vertex, d_vertex&, d_vertex&);
  66.      d_vertex makepath(void*);
  67.      d_vertex findpath(d_vertex);
  68.      d_vertex findpathcost(d_path, double&);
  69.      d_vertex findtail(d_path);
  70.      void   addpathcost(d_path, double);
  71.      d_vertex join(d_path, d_path, d_path);
  72.      void   split(d_vertex, d_vertex&, d_vertex&);
  73.      
  74.      d_path   expose(d_vertex);
  75. virtual void copy_inf(GenPtr& x)      { x=x; }
  76. virtual void clear_inf(GenPtr& x)     { x=0; }
  77. public:
  78.      dyna_trees() { first=last=0; };
  79.      virtual ~dyna_trees();
  80.      void*    inf(d_vertex v) { return v->info; }
  81.        
  82.      d_vertex maketree(void*);
  83.      d_vertex findroot(d_vertex);
  84.      d_vertex findcost(d_vertex, double&);
  85.      void   addcost(d_vertex, double);
  86.      void   link(d_vertex, d_vertex);
  87.      void   cut(d_vertex);
  88. };
  89. /*{Manpage {tree_collection} {I} {Dynamic Collections of Trees}}*/
  90. template<class I>
  91. class  tree_collection : private dyna_trees{
  92. /*{Mdefinition
  93. An instance $D$ of the parameterized data type name is a
  94. collection of vertex disjoint rooted trees, each of whose vertices has a
  95. double-valued cost and contains an information of type $I$, called the
  96. information type of $D$.}*/
  97. void copy_inf(GenPtr& x)      { LEDA_COPY(I,x); }
  98. void clear_inf(GenPtr& x)     { LEDA_CLEAR(I,x);  }
  99. public:
  100. /*{Mcreation D }*/ 
  101. tree_collection() {}
  102. /*{Mcreate creates an instance var of type name, initialized with the
  103.             empty collection.}*/
  104. ~tree_collection() {}
  105. /*{Moperations 2 5}*/
  106. d_vertex maketree(I x)  { return dyna_trees::maketree(Convert(x)); }
  107. /*{Mop       adds a new tree to $D$ containing a single
  108.       vertex $v$ with cost zero and information $x$,
  109.       and returns $v$.}*/
  110. I    inf(d_vertex v)    { return LEDA_ACCESS(I,dyna_trees::inf(v)); }
  111. /*{Mop       returns the information of vertex $v$.}*/
  112. d_vertex findroot(d_vertex v) const;
  113. /*{Mop       returns the root of the tree containing $v$.}*/
  114. d_vertex findcost(d_vertex v, double& x);
  115. /*{Mopl      sets $x$ to the minimum cost of a vertex on the
  116.       tree path from $v$ to findroot($v$) and returns
  117.       the last vertex (closest to the root) on this
  118.       path of cost $x$.}*/
  119. void addcost(d_vertex v, double x);
  120. /*{Mopl     adds double number $x$ to the cost of every vertex
  121.      on the tree path from $v$ to findroot($v$).}*/
  122. void link(d_vertex v, d_vertex x);
  123. /*{Mopl     combines the trees containing vertices $v$ and $w$
  124.      by adding the edge $(v,w)$. (We regard tree
  125.      edges as directed from child to parent.)\
  126.      precond $v$ and $w$ are in different trees
  127.      and $v$ is a root.}*/
  128. void cut(d_vertex v);
  129. /*{Mop      divides the tree containing vertex $v$ into 
  130.      two trees by deleting the edge out of $v$.\
  131.      precond $v$ is not a tree root.}*/
  132. };
  133. /*{Mimplementation
  134. Dynamic collections of trees are implemented by partitioning the trees
  135. into vertex disjoint paths and representing each path by a self-adjusting
  136. binary tree (see cite{T83}). All operations take amortized time $O(log n)$
  137. where $n$ is the number of maketree operations.}*/
  138. #endif