lemon/prim.h
author deba
Tue, 07 Feb 2006 09:20:47 +0000
changeset 1965 71b3bc042c47
parent 1953 d4f411003580
child 1979 c2992fd74dad
permissions -rw-r--r--
Compilation with G++ -ansi
     1 /* -*- C++ -*-
     2  *
     3  * This file is a part of LEMON, a generic C++ optimization library
     4  *
     5  * Copyright (C) 2003-2006
     6  * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
     7  * (Egervary Research Group on Combinatorial Optimization, EGRES).
     8  *
     9  * Permission to use, modify and distribute this software is granted
    10  * provided that this copyright notice appears in all copies. For
    11  * precise terms see the accompanying LICENSE file.
    12  *
    13  * This software is provided "AS IS" with no warranty of any kind,
    14  * express or implied, and with no claim as to its suitability for any
    15  * purpose.
    16  *
    17  */
    18 
    19 #ifndef LEMON_PRIM_H
    20 #define LEMON_PRIM_H
    21 
    22 ///\ingroup spantree
    23 ///\file
    24 ///\brief Prim algorithm to compute minimum spanning tree.
    25 
    26 #include <lemon/list_graph.h>
    27 #include <lemon/bin_heap.h>
    28 #include <lemon/invalid.h>
    29 #include <lemon/error.h>
    30 #include <lemon/maps.h>
    31 #include <lemon/traits.h>
    32 
    33 #include <lemon/concept/ugraph.h>
    34 
    35 namespace lemon {
    36 
    37   ///Default traits class of Prim class.
    38 
    39   ///Default traits class of Prim class.
    40   ///\param GR Graph type.
    41   ///\param LM Type of cost map.
    42   template<class GR, class LM>
    43   struct PrimDefaultTraits{
    44     ///The graph type the algorithm runs on. 
    45     typedef GR UGraph;
    46     ///The type of the map that stores the edge costs.
    47 
    48     ///The type of the map that stores the edge costs.
    49     ///It must meet the \ref concept::ReadMap "ReadMap" concept.
    50     typedef LM CostMap;
    51     //The type of the cost of the edges.
    52     typedef typename LM::Value Value;
    53     /// The cross reference type used by heap.
    54 
    55     /// The cross reference type used by heap.
    56     /// Usually it is \c UGraph::NodeMap<int>.
    57     typedef typename UGraph::template NodeMap<int> HeapCrossRef;
    58     ///Instantiates a HeapCrossRef.
    59 
    60     ///This function instantiates a \ref HeapCrossRef. 
    61     /// \param _graph is the graph, to which we would like to define the 
    62     /// HeapCrossRef.
    63     static HeapCrossRef *createHeapCrossRef(const GR &_graph){
    64       return new HeapCrossRef(_graph);
    65     }
    66     
    67     ///The heap type used by Prim algorithm.
    68 
    69     ///The heap type used by Prim algorithm.
    70     ///
    71     ///\sa BinHeap
    72     ///\sa Prim
    73     typedef BinHeap<typename UGraph::Node, typename LM::Value,
    74 		    HeapCrossRef, std::less<Value> > Heap;
    75 
    76     static Heap *createHeap(HeapCrossRef& _ref){
    77       return new Heap(_ref);
    78     }
    79 
    80     ///\brief The type of the map that stores the last
    81     ///edges of the minimum spanning tree.
    82     /// 
    83     ///The type of the map that stores the last
    84     ///edges of the minimum spanning tree.
    85     ///It must meet the \ref concept::WriteMap "WriteMap" concept.
    86     ///
    87     typedef typename UGraph::template NodeMap<typename GR::UEdge> PredMap;
    88     ///Instantiates a PredMap.
    89  
    90     ///This function instantiates a \ref PredMap. 
    91     ///\param _graph is the graph, to which we would like to define the PredMap.
    92     static PredMap *createPredMap(const GR &_graph){
    93       return new PredMap(_graph);
    94     }
    95 
    96     ///The type of the map that stores whether an edge is in the
    97     ///spanning tree or not.
    98 
    99     ///The type of the map that stores whether an edge is in the
   100     ///spanning tree or not.
   101     ///By default it is a NullMap.
   102     typedef NullMap<typename UGraph::UEdge,bool> TreeMap;
   103     ///Instantiates a TreeMap.
   104 
   105     ///This function instantiates a \ref TreeMap.
   106     ///
   107     ///The first parameter is the graph, to which
   108     ///we would like to define the \ref TreeMap
   109     static TreeMap *createTreeMap(const GR &){
   110       return new TreeMap();
   111     }
   112 
   113     ///The type of the map that stores whether a nodes is processed.
   114  
   115     ///The type of the map that stores whether a nodes is processed.
   116     ///It must meet the \ref concept::WriteMap "WriteMap" concept.
   117     ///By default it is a NodeMap<bool>.
   118     typedef NullMap<typename UGraph::Node,bool> ProcessedMap;
   119     ///Instantiates a ProcessedMap.
   120  
   121     ///This function instantiates a \ref ProcessedMap. 
   122     ///\param _graph is the graph, to which
   123     ///we would like to define the \ref ProcessedMap
   124 #ifdef DOXYGEN
   125     static ProcessedMap *createProcessedMap(const GR &_graph)
   126 #else
   127     static ProcessedMap *createProcessedMap(const GR &)
   128 #endif
   129     {
   130       return new ProcessedMap();
   131     }
   132   };
   133   
   134   ///%Prim algorithm class to find a minimum spanning tree.
   135   
   136   /// \ingroup spantree
   137   ///This class provides an efficient implementation of %Prim algorithm.
   138   ///
   139   ///The running time is O(e*log n) where e is the number of edges and
   140   ///n is the number of nodes in the graph.
   141   ///
   142   ///The edge costs are passed to the algorithm using a
   143   ///\ref concept::ReadMap "ReadMap",
   144   ///so it is easy to change it to any kind of cost.
   145   ///
   146   ///The type of the cost is determined by the
   147   ///\ref concept::ReadMap::Value "Value" of the cost map.
   148   ///
   149   ///It is also possible to change the underlying priority heap.
   150   ///
   151   ///\param GR The graph type the algorithm runs on. The default value
   152   ///is \ref ListUGraph. The value of GR is not used directly by
   153   ///Prim, it is only passed to \ref PrimDefaultTraits.
   154   ///
   155   ///\param LM This read-only UEdgeMap determines the costs of the
   156   ///edges. It is read once for each edge, so the map may involve in
   157   ///relatively time consuming process to compute the edge cost if
   158   ///it is necessary. The default map type is \ref
   159   ///concept::UGraph::UEdgeMap "UGraph::UEdgeMap<int>".  The value
   160   ///of LM is not used directly by Prim, it is only passed to \ref
   161   ///PrimDefaultTraits.
   162   ///
   163   ///\param TR Traits class to set
   164   ///various data types used by the algorithm.  The default traits
   165   ///class is \ref PrimDefaultTraits
   166   ///"PrimDefaultTraits<GR,LM>".  See \ref
   167   ///PrimDefaultTraits for the documentation of a Prim traits
   168   ///class.
   169   ///
   170   ///\author Balazs Attila Mihaly
   171 
   172 #ifdef DOXYGEN
   173   template <typename GR,
   174 	    typename LM,
   175 	    typename TR>
   176 #else
   177   template <typename GR=ListUGraph,
   178 	    typename LM=typename GR::template UEdgeMap<int>,
   179 	    typename TR=PrimDefaultTraits<GR,LM> >
   180 #endif
   181   class Prim {
   182   public:
   183     /**
   184      * \brief \ref Exception for uninitialized parameters.
   185      *
   186      * This error represents problems in the initialization
   187      * of the parameters of the algorithms.
   188      */
   189     class UninitializedParameter : public lemon::UninitializedParameter {
   190     public:
   191       virtual const char* exceptionName() const {
   192 	return "lemon::Prim::UninitializedParameter";
   193       }
   194     };
   195 
   196     typedef TR Traits;
   197     ///The type of the underlying graph.
   198     typedef typename TR::UGraph UGraph;
   199     ///\e
   200     typedef typename UGraph::Node Node;
   201     ///\e
   202     typedef typename UGraph::NodeIt NodeIt;
   203     ///\e
   204     typedef typename UGraph::UEdge UEdge;
   205     ///\e
   206     typedef typename UGraph::IncEdgeIt IncEdgeIt;
   207     
   208     ///The type of the cost of the edges.
   209     typedef typename TR::CostMap::Value Value;
   210     ///The type of the map that stores the edge costs.
   211     typedef typename TR::CostMap CostMap;
   212     ///\brief The type of the map that stores the last
   213     ///predecessor edges of the spanning tree.
   214     typedef typename TR::PredMap PredMap;
   215     ///Edges of the spanning tree.
   216     typedef typename TR::TreeMap TreeMap;
   217     ///The type of the map indicating if a node is processed.
   218     typedef typename TR::ProcessedMap ProcessedMap;
   219     ///The cross reference type used for the current heap.
   220     typedef typename TR::HeapCrossRef HeapCrossRef;
   221     ///The heap type used by the prim algorithm.
   222     typedef typename TR::Heap Heap;
   223   private:
   224     /// Pointer to the underlying graph.
   225     const UGraph *graph;
   226     /// Pointer to the cost map
   227     const CostMap *cost;
   228     ///Pointer to the map of predecessors edges.
   229     PredMap *_pred;
   230     ///Indicates if \ref _pred is locally allocated (\c true) or not.
   231     bool local_pred;
   232     ///Pointer to the map of tree edges.
   233     TreeMap *_tree;
   234     ///Indicates if \ref _tree is locally allocated (\c true) or not.
   235     bool local_tree;
   236     ///Pointer to the map of processed status of the nodes.
   237     ProcessedMap *_processed;
   238     ///Indicates if \ref _processed is locally allocated (\c true) or not.
   239     bool local_processed;
   240     ///Pointer to the heap cross references.
   241     HeapCrossRef *_heap_cross_ref;
   242     ///Indicates if \ref _heap_cross_ref is locally allocated (\c true) or not.
   243     bool local_heap_cross_ref;
   244     ///Pointer to the heap.
   245     Heap *_heap;
   246     ///Indicates if \ref _heap is locally allocated (\c true) or not.
   247     bool local_heap;
   248 
   249     ///Creates the maps if necessary.
   250     void create_maps(){
   251       if(!_pred) {
   252 	local_pred = true;
   253 	_pred = Traits::createPredMap(*graph);
   254       }
   255       if(!_tree) {
   256 	local_tree = true;
   257 	_tree = Traits::createTreeMap(*graph);
   258       }
   259       if(!_processed) {
   260 	local_processed = true;
   261 	_processed = Traits::createProcessedMap(*graph);
   262       }
   263       if (!_heap_cross_ref) {
   264 	local_heap_cross_ref = true;
   265 	_heap_cross_ref = Traits::createHeapCrossRef(*graph);
   266       }
   267       if (!_heap) {
   268 	local_heap = true;
   269 	_heap = Traits::createHeap(*_heap_cross_ref);
   270       }
   271     }
   272     
   273   public :
   274 
   275     typedef Prim Create;
   276  
   277     ///\name Named template parameters
   278 
   279     ///@{
   280 
   281     template <class T>
   282     struct DefPredMapTraits : public Traits {
   283       typedef T PredMap;
   284       static PredMap *createPredMap(const UGraph &_graph){
   285 	throw UninitializedParameter();
   286       }
   287     };
   288     ///\ref named-templ-param "Named parameter" for setting PredMap type
   289 
   290     ///\ref named-templ-param "Named parameter" for setting PredMap type
   291     ///
   292     template <class T>
   293     struct DefPredMap 
   294       : public Prim< UGraph, CostMap, DefPredMapTraits<T> > {
   295       typedef Prim< UGraph, CostMap, DefPredMapTraits<T> > Create;
   296     };
   297     
   298     template <class T>
   299     struct DefProcessedMapTraits : public Traits {
   300       typedef T ProcessedMap;
   301       static ProcessedMap *createProcessedMap(const UGraph &_graph){
   302 	throw UninitializedParameter();
   303       }
   304     };
   305     ///\ref named-templ-param "Named parameter" for setting ProcessedMap type
   306 
   307     ///\ref named-templ-param "Named parameter" for setting ProcessedMap type
   308     ///
   309     template <class T>
   310     struct DefProcessedMap 
   311       : public Prim< UGraph, CostMap, DefProcessedMapTraits<T> > { 
   312       typedef Prim< UGraph, CostMap, DefProcessedMapTraits<T> > Create;
   313     };
   314     
   315     struct DefGraphProcessedMapTraits : public Traits {
   316       typedef typename UGraph::template NodeMap<bool> ProcessedMap;
   317       static ProcessedMap *createProcessedMap(const UGraph &_graph){
   318 	return new ProcessedMap(_graph);
   319       }
   320     };
   321 
   322 
   323     template <class H, class CR>
   324     struct DefHeapTraits : public Traits {
   325       typedef CR HeapCrossRef;
   326       typedef H Heap;
   327       static HeapCrossRef *createHeapCrossRef(const UGraph &) {
   328 	throw UninitializedParameter();
   329       }
   330       static Heap *createHeap(HeapCrossRef &){
   331 	return UninitializedParameter();
   332       }
   333     };
   334     ///\ref named-templ-param "Named parameter" for setting heap and cross 
   335     ///reference type
   336 
   337     ///\ref named-templ-param "Named parameter" for setting heap and cross 
   338     ///reference type
   339     ///
   340     template <class H, class CR = typename UGraph::template NodeMap<int> >
   341     struct DefHeap
   342       : public Prim< UGraph, CostMap, DefHeapTraits<H, CR> > {
   343       typedef Prim< UGraph, CostMap, DefHeapTraits<H, CR> > Create;
   344     };
   345 
   346     template <class H, class CR>
   347     struct DefStandardHeapTraits : public Traits {
   348       typedef CR HeapCrossRef;
   349       typedef H Heap;
   350       static HeapCrossRef *createHeapCrossRef(const UGraph &_graph) {
   351 	return new HeapCrossRef(_graph);
   352       }
   353       static Heap *createHeap(HeapCrossRef &ref){
   354 	return new Heap(ref);
   355       }
   356     };
   357     ///\ref named-templ-param "Named parameter" for setting heap and cross 
   358     ///reference type with automatic allocation
   359 
   360     ///\ref named-templ-param "Named parameter" for setting heap and cross 
   361     ///reference type. It can allocate the heap and the cross reference 
   362     ///object if the cross reference's constructor waits for the graph as 
   363     ///parameter and the heap's constructor waits for the cross reference.
   364     template <class H, class CR = typename UGraph::template NodeMap<int> >
   365     struct DefStandardHeap
   366       : public Prim< UGraph, CostMap, DefStandardHeapTraits<H, CR> > { 
   367       typedef Prim< UGraph, CostMap, DefStandardHeapTraits<H, CR> > 
   368       Create;
   369     };
   370 
   371     template <class TM>
   372     struct DefTreeMapTraits : public Traits {
   373       typedef TM TreeMap;
   374       static TreeMap *createTreeMap(const UGraph &) {
   375         throw UninitializedParameter();
   376       }
   377     };
   378     ///\ref named-templ-param "Named parameter" for setting TreeMap
   379 
   380     ///\ref named-templ-param "Named parameter" for setting TreeMap
   381     ///
   382     template <class TM>
   383     struct DefTreeMap
   384       : public Prim< UGraph, CostMap, DefTreeMapTraits<TM> > {
   385       typedef Prim< UGraph, CostMap, DefTreeMapTraits<TM> > Create;
   386     };    
   387 
   388     struct DefGraphTreeMapTraits : public Traits {
   389       typedef typename UGraph::template NodeMap<bool> TreeMap;
   390       static TreeMap *createTreeMap(const UGraph &_graph){
   391 	return new TreeMap(_graph);
   392       }
   393     };
   394 
   395     ///@}
   396 
   397 
   398   protected:
   399 
   400     Prim() {}
   401 
   402   public:      
   403     
   404     ///Constructor.
   405     
   406     ///\param _graph the graph the algorithm will run on.
   407     ///\param _cost the cost map used by the algorithm.
   408     Prim(const UGraph& _graph, const CostMap& _cost) :
   409       graph(&_graph), cost(&_cost),
   410       _pred(NULL), local_pred(false),
   411       _tree(NULL), local_tree(false),
   412       _processed(NULL), local_processed(false),
   413       _heap_cross_ref(NULL), local_heap_cross_ref(false),
   414       _heap(NULL), local_heap(false)
   415     {
   416       checkConcept<concept::UGraph, UGraph>();
   417     }
   418     
   419     ///Destructor.
   420     ~Prim(){
   421       if(local_pred) delete _pred;
   422       if(local_tree) delete _tree;
   423       if(local_processed) delete _processed;
   424       if(local_heap_cross_ref) delete _heap_cross_ref;
   425       if(local_heap) delete _heap;
   426     }
   427 
   428     ///\brief Sets the cost map.
   429 
   430     ///Sets the cost map.
   431     ///\return <tt> (*this) </tt>
   432     Prim &costMap(const CostMap &m){
   433       cost = &m;
   434       return *this;
   435     }
   436 
   437     ///\brief Sets the map storing the predecessor edges.
   438 
   439     ///Sets the map storing the predecessor edges.
   440     ///If you don't use this function before calling \ref run(),
   441     ///it will allocate one. The destuctor deallocates this
   442     ///automatically allocated map, of course.
   443     ///\return <tt> (*this) </tt>
   444     Prim &predMap(PredMap &m){
   445       if(local_pred) {
   446 	delete _pred;
   447 	local_pred=false;
   448       }
   449       _pred = &m;
   450       return *this;
   451     }
   452 
   453     ///\brief Sets the map storing the tree edges.
   454 
   455     ///Sets the map storing the tree edges.
   456     ///If you don't use this function before calling \ref run(),
   457     ///it will allocate one. The destuctor deallocates this
   458     ///automatically allocated map, of course.
   459     ///By default this is a NullMap.
   460     ///\return <tt> (*this) </tt>
   461     Prim &treeMap(TreeMap &m){
   462       if(local_tree) {
   463 	delete _tree;
   464 	local_tree=false;
   465       }
   466       _tree = &m;
   467       return *this;
   468     }
   469 
   470     ///\brief Sets the heap and the cross reference used by algorithm.
   471 
   472     ///Sets the heap and the cross reference used by algorithm.
   473     ///If you don't use this function before calling \ref run(),
   474     ///it will allocate one. The destuctor deallocates this
   475     ///automatically allocated map, of course.
   476     ///\return <tt> (*this) </tt>
   477     Prim &heap(Heap& heap, HeapCrossRef &crossRef){
   478       if(local_heap_cross_ref) {
   479 	delete _heap_cross_ref;
   480 	local_heap_cross_ref=false;
   481       }
   482       _heap_cross_ref = &crossRef;
   483       if(local_heap) {
   484 	delete _heap;
   485 	local_heap=false;
   486       }
   487       _heap = &heap;
   488       return *this;
   489     }
   490 
   491   public:
   492     ///\name Execution control
   493     ///The simplest way to execute the algorithm is to use
   494     ///one of the member functions called \c run(...).
   495     ///\n
   496     ///If you need more control on the execution,
   497     ///first you must call \ref init(), then you can add several source nodes
   498     ///with \ref addSource().
   499     ///Finally \ref start() will perform the actual path
   500     ///computation.
   501 
   502     ///@{
   503 
   504     ///\brief Initializes the internal data structures.
   505 
   506     ///Initializes the internal data structures.
   507     ///
   508     void init(){
   509       create_maps();
   510       _heap->clear();
   511       for ( NodeIt u(*graph) ; u!=INVALID ; ++u ) {
   512 	_pred->set(u,INVALID);
   513 	_processed->set(u,false);
   514 	_heap_cross_ref->set(u,Heap::PRE_HEAP);
   515       }
   516     }
   517     
   518     ///\brief Adds a new source node.
   519 
   520     ///Adds a new source node to the priority heap.
   521     ///
   522     ///It checks if the node has already been added to the heap and
   523     ///it is pushed to the heap only if it was not in the heap.
   524     void addSource(Node s){
   525       if(_heap->state(s) != Heap::IN_HEAP) {
   526 	_heap->push(s,Value());
   527       }
   528     }
   529     ///\brief Processes the next node in the priority heap
   530 
   531     ///Processes the next node in the priority heap.
   532     ///
   533     ///\return The processed node.
   534     ///
   535     ///\warning The priority heap must not be empty!
   536     Node processNextNode(){
   537       Node v=_heap->top(); 
   538       _heap->pop();
   539       _processed->set(v,true);
   540       
   541       for(IncEdgeIt e(*graph,v); e!=INVALID; ++e) {
   542 	Node w=graph->oppositeNode(v,e);
   543 	switch(_heap->state(w)) {
   544 	case Heap::PRE_HEAP:
   545 	  _heap->push(w,(*cost)[e]);
   546 	  _pred->set(w,e);
   547 	  break;
   548 	case Heap::IN_HEAP:
   549 	  if ( (*cost)[e] < (*_heap)[w] ) {
   550 	    _heap->decrease(w,(*cost)[e]); 
   551 	    _pred->set(w,e);
   552 	  }
   553 	  break;
   554 	case Heap::POST_HEAP:
   555 	  break;
   556 	}
   557       }
   558       if ((*_pred)[v]!=INVALID)_tree->set((*_pred)[v],true);
   559       return v;
   560     }
   561 
   562     ///\brief Next node to be processed.
   563     
   564     ///Next node to be processed.
   565     ///
   566     ///\return The next node to be processed or INVALID if the priority heap
   567     /// is empty.
   568     Node nextNode(){ 
   569       return _heap->empty()?_heap->top():INVALID;
   570     }
   571  
   572     ///\brief Returns \c false if there are nodes to be processed in the priority heap
   573     ///
   574     ///Returns \c false if there are nodes
   575     ///to be processed in the priority heap
   576     bool emptyQueue() { return _heap->empty(); }
   577     ///\brief Returns the number of the nodes to be processed in the priority heap
   578 
   579     ///Returns the number of the nodes to be processed in the priority heap
   580     ///
   581     int queueSize() { return _heap->size(); }
   582     
   583     ///\brief Executes the algorithm.
   584 
   585     ///Executes the algorithm.
   586     ///
   587     ///\pre init() must be called and at least one node should be added
   588     ///with addSource() before using this function.
   589     ///
   590     ///This method runs the %Prim algorithm from the node(s)
   591     ///in order to compute the
   592     ///minimum spanning tree.
   593     ///
   594     void start(){
   595       while ( !_heap->empty() ) processNextNode();
   596     }
   597     
   598     ///\brief Executes the algorithm until a condition is met.
   599 
   600     ///Executes the algorithm until a condition is met.
   601     ///
   602     ///\pre init() must be called and at least one node should be added
   603     ///with addSource() before using this function.
   604     ///
   605     ///\param nm must be a bool (or convertible) node map. The algorithm
   606     ///will stop when it reaches a node \c v with <tt>nm[v]==true</tt>.
   607     template<class NodeBoolMap>
   608     void start(const NodeBoolMap &nm){
   609       while ( !_heap->empty() && !nm[_heap->top()] ) processNextNode();
   610       if ( !_heap->empty() ) _processed->set(_heap->top(),true);
   611     }
   612     
   613     ///\brief Runs %Prim algorithm.
   614     
   615     ///This method runs the %Prim algorithm
   616     ///in order to compute the
   617     ///minimum spanning tree (or minimum spanning forest).
   618     ///The method also works on graphs that has more than one components.
   619     ///In this case it computes the minimum spanning forest.
   620     void run() {
   621       init();
   622       for(NodeIt it(*graph);it!=INVALID;++it){
   623 	if(!processed(it)){
   624 	  addSource(it);
   625 	  start();
   626 	}
   627       }
   628     }
   629 
   630     ///\brief Runs %Prim algorithm from node \c s.
   631     
   632     ///This method runs the %Prim algorithm from node \c s
   633     ///in order to
   634     ///compute the
   635     ///minimun spanning tree
   636     ///
   637     ///\note d.run(s) is just a shortcut of the following code.
   638     ///\code
   639     ///  d.init();
   640     ///  d.addSource(s);
   641     ///  d.start();
   642     ///\endcode
   643     ///\note If the graph has more than one components, the method
   644     ///will compute the minimun spanning tree for only one component.
   645     ///
   646     ///See \ref run() if you want to compute the minimal spanning forest.
   647     void run(Node s){
   648       init();
   649       addSource(s);
   650       start();
   651     }
   652     
   653     ///@}
   654 
   655     ///\name Query Functions
   656     ///The result of the %Prim algorithm can be obtained using these
   657     ///functions.\n
   658     ///Before the use of these functions,
   659     ///either run() or start() must be called.
   660     
   661     ///@{
   662 
   663     ///\brief Returns the 'previous edge' of the minimum spanning tree.
   664 
   665     ///For a node \c v it returns the 'previous edge' of the minimum spanning tree,
   666     ///i.e. it returns the edge from where \c v was reached. For a source node
   667     ///or an unreachable node it is \ref INVALID.
   668     ///The minimum spanning tree used here is equal to the minimum spanning tree used
   669     ///in \ref predNode().  \pre \ref run() or \ref start() must be called before
   670     ///using this function.
   671     UEdge predEdge(Node v) const { return (*_pred)[v]; }
   672 
   673     ///\brief Returns the 'previous node' of the minimum spanning tree.
   674 
   675     ///For a node \c v it returns the 'previous node' of the minimum spanning tree,
   676     ///i.e. it returns the node from where \c v was reached. For a source node
   677     ///or an unreachable node it is \ref INVALID.
   678     //The minimum spanning tree used here is equal to the minimum spanning
   679     ///tree used in \ref predEdge().  \pre \ref run() or \ref start() must be called
   680     ///before using this function.
   681     Node predNode(Node v) const { return (*_pred)[v]==INVALID ? INVALID:
   682 				  graph->source((*_pred)[v]); }
   683     
   684     ///\brief Returns a reference to the NodeMap of the edges of the minimum spanning tree.
   685 
   686     ///Returns a reference to the NodeMap of the edges of the
   687     ///minimum spanning tree.
   688     ///\pre \ref run() or \ref start() must be called before using this function.
   689     const PredMap &predMap() const { return *_pred;}
   690  
   691     ///\brief Returns a reference to the tree edges map.
   692 
   693     ///Returns a reference to the TreeEdgeMap of the edges of the
   694     ///minimum spanning tree. The value of the map is \c true only if the edge is in
   695     ///the minimum spanning tree.
   696     ///\warning By default, the TreeEdgeMap is a NullMap.
   697     ///
   698     ///If it is not set before the execution of the algorithm, use the \ref
   699     ///treeMap(TreeMap&) function (after the execution) to set an UEdgeMap with the
   700     ///edges of the minimum spanning tree in O(n) time where n is the number of
   701     ///nodes in the graph.
   702     ///\pre \ref run() or \ref start() must be called before using this function.
   703     const TreeMap &treeMap() const { return *_tree;}
   704  
   705     ///\brief Sets the tree edges map.
   706 
   707     ///Sets the TreeMap of the edges of the minimum spanning tree.
   708     ///The map values belonging to the edges of the minimum
   709     ///spanning tree are set to \c tree_edge_value or \c true by default,
   710     ///the other map values remain untouched.
   711     ///
   712     ///\pre \ref run() or \ref start() must be called before using this function.
   713 
   714     template<class TreeMap>
   715     void quickTreeEdges(
   716         TreeMap& tree,
   717         const typename TreeMap::Value& tree_edge_value=true) const {
   718       for(NodeIt i(*graph);i!=INVALID;++i){
   719         if((*_pred)[i]!=INVALID) tree.set((*_pred)[i],tree_edge_value);
   720       }
   721     }
   722 
   723     ///\brief Sets the tree edges map.
   724 
   725     ///Sets the TreeMap of the edges of the minimum spanning tree.
   726     ///The map values belonging to the edges of the minimum
   727     ///spanning tree are set to \c tree_edge_value or \c true by default while
   728     ///the edge values not belonging to the minimum spanning tree are set to
   729     ///\c tree_default_value or \c false by default.
   730     ///
   731     ///\pre \ref run() or \ref start() must be called before using this function.
   732 
   733     template<class TreeMap>
   734     void treeEdges(
   735         TreeMap& tree,
   736         const typename TreeMap::Value& tree_edge_value=true,
   737         const typename TreeMap::Value& tree_default_value=false) const {
   738       for(typename ItemSetTraits<UGraph,UEdge>::ItemIt i(*graph);i!=INVALID;++i)
   739 	tree.set(i,tree_default_value);
   740       for(NodeIt i(*graph);i!=INVALID;++i){
   741         if((*_pred)[i]!=INVALID) tree.set((*_pred)[i],tree_edge_value);
   742       }
   743     }
   744 
   745     ///\brief Checks if a node is reachable from the starting node.
   746 
   747     ///Returns \c true if \c v is reachable from the starting node.
   748     ///\warning The source nodes are inditated as unreached.
   749     ///\pre \ref run() or \ref start() must be called before using this function.
   750     ///
   751     bool reached(Node v) { return (*_heap_cross_ref)[v] != Heap::PRE_HEAP; }
   752 
   753     ///\brief Checks if a node is processed.
   754 
   755     ///Returns \c true if \c v is processed, i.e. \c v is already connencted to the
   756     ///minimum spanning tree.
   757     ///\pre \ref run() or \ref start() must be called before using this function.
   758     ///
   759     bool processed(Node v) { return (*_heap_cross_ref)[v] == Heap::POST_HEAP; }
   760     
   761 
   762     ///\brief Checks if an edge is in the spanning tree or not.
   763 
   764     ///Checks if an edge is in the spanning tree or not.
   765     ///\param e is the edge that will be checked
   766     ///\return \c true if e is in the spanning tree, \c false otherwise
   767     bool tree(UEdge e){
   768       return (*_pred)[*graph.source(e)]==e || (*_pred)[*graph.target(e)]==e;
   769     }
   770     ///@}
   771   };
   772 
   773 
   774   /// \ingroup spantree
   775   ///
   776   /// \brief Function type interface for Prim algorithm.
   777   ///
   778   /// Function type interface for Prim algorithm.
   779   /// \param graph the UGraph that the algorithm runs on
   780   /// \param cost the CostMap of the edges
   781   /// \retval tree the EdgeMap that contains whether an edge is in 
   782   /// the spanning tree or not
   783   ///
   784   ///\sa Prim
   785   template<class Graph,class CostMap,class TreeMap>
   786   void prim(const Graph& graph, const CostMap& cost,TreeMap& tree){
   787     typename Prim<Graph,CostMap>::template DefTreeMap<TreeMap>::
   788       Create prm(graph,cost);
   789     prm.treeMap(tree);
   790     prm.run();
   791   };
   792 
   793 } //END OF NAMESPACE LEMON
   794 
   795 #endif