home *** CD-ROM | disk | FTP | other *** search
- /*******************************************************************************
- +
- + LEDA 2.1.1 11-15-1991
- +
- +
- + tree_collection.h
- +
- +
- + Copyright (c) 1991 by Max-Planck-Institut fuer Informatik
- + Im Stadtwald, 6600 Saarbruecken, FRG
- + All rights reserved.
- +
- *******************************************************************************/
-
-
-
-
- #ifndef DYNTREESH
- #define DYNTREESH
-
- #include <LEDA/basic.h>
-
- /*********************************************************************\
- * *
- * dyna_trees T; deklariert eine (vorerst leere) Menge von dyn_trees *
- * *
- * d_vertex T.maketree(); Erzeugt einen Baum, der genau einen Knoten *
- * enthaelt (der in keinen anderem Baum enthalten ist. *
- * *
- * d_vertex T.findroot(d_vertex v); Gibt die Wurzel des v enthaltenden*
- * Baumes zurueck. *
- * *
- * d_vertex T.findcost(d_vertex v, double& d); Gibt den entsprechenden*
- * Knoten zurueck (s.o.), die Kosten werden im Argument d zurueck- *
- * gegeben. *
- * *
- * void T.addcost(d_vertex v, double x); s.o. *
- * *
- * void T.link(d_vertex v, d_vertex w); s.o. *
- * *
- * void T.cut(d_vertex v); s.o. *
- * *
- * *
- * Implemented by Jan Timm *
- * *
- \*********************************************************************/
-
-
-
-
-
- class d_node;
- typedef d_node *d_vertex;
- typedef d_node *d_path;
-
- class d_node {
-
- friend class dyna_trees;
-
- void* info; // user-defined information
-
- d_vertex left, // linkes Kind
- right, // rechtes Kind
- parent, // Elter
- successor, // Nachfolger (fuer Pfad)
- next; // fuer Verkettung fuer ~dyna_tree
-
- double dcost,
- dmin;
-
- d_node(void* i) {
- left=right=parent=successor=next=0;
- dcost=dmin=0;
- info = i;
- };
- OPERATOR_NEW(10);
- OPERATOR_DEL(10);
-
- };
-
-
- class dyna_trees {
- d_vertex first,
- last; // diese beiden Zeiger fuer ~dyna_tree
-
- void splay(d_vertex);
-
- d_vertex assemble(d_vertex, d_vertex, d_vertex);
- void disassemble(d_vertex, d_vertex&, d_vertex&);
-
- d_vertex makepath(void*);
- d_vertex findpath(d_vertex);
- d_vertex findpathcost(d_path, double&);
- d_vertex findtail(d_path);
- void addpathcost(d_path, double);
- d_vertex join(d_path, d_path, d_path);
- void split(d_vertex, d_vertex&, d_vertex&);
-
- d_path expose(d_vertex);
-
- virtual void copy_inf(ent& x) { x=x; }
- virtual void clear_inf(ent& x) { x=0; }
-
- public:
- dyna_trees() { first=last=0; };
- ~dyna_trees();
-
- void* inf(d_vertex v) { return v->info; }
-
- d_vertex maketree(void*);
- d_vertex findroot(d_vertex);
- d_vertex findcost(d_vertex, double&);
- void addcost(d_vertex, double);
- void link(d_vertex, d_vertex);
- void cut(d_vertex);
- };
-
- #define tree_collection(itype) name2(itype,tree_collection)
-
- #define tree_collectiondeclare(itype)\
- \
- class tree_collection(itype) : public dyna_trees{\
- \
- void copy_inf(ent& x) { x = Copy(*(itype*)&x); }\
- void clear_inf(ent& x) { Clear(*(itype*)&x); }\
- \
- public:\
- \
- d_vertex maketree(itype x) { return dyna_trees::maketree(Ent(x)); }\
- itype inf(d_vertex v) { return itype(dyna_trees::inf(v)); }\
- \
- tree_collection(itype)() {}\
- ~tree_collection(itype)() {}\
- \
- };
-
- #endif
-
-