src/lemon/bfs.h
author athos
Tue, 22 Mar 2005 12:02:29 +0000
changeset 1241 dadc9987c537
parent 1218 5331168bbb18
child 1270 806451fd084b
permissions -rw-r--r--
Modified a bit.
     1 /* -*- C++ -*-
     2  * src/lemon/bfs.h - Part of LEMON, a generic C++ optimization library
     3  *
     4  * Copyright (C) 2005 Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
     5  * (Egervary Combinatorial Optimization Research Group, EGRES).
     6  *
     7  * Permission to use, modify and distribute this software is granted
     8  * provided that this copyright notice appears in all copies. For
     9  * precise terms see the accompanying LICENSE file.
    10  *
    11  * This software is provided "AS IS" with no warranty of any kind,
    12  * express or implied, and with no claim as to its suitability for any
    13  * purpose.
    14  *
    15  */
    16 
    17 #ifndef LEMON_BFS_H
    18 #define LEMON_BFS_H
    19 
    20 ///\ingroup flowalgs
    21 ///\file
    22 ///\brief Bfs algorithm.
    23 
    24 #include <lemon/list_graph.h>
    25 #include <lemon/graph_utils.h>
    26 #include <lemon/invalid.h>
    27 #include <lemon/error.h>
    28 #include <lemon/maps.h>
    29 
    30 namespace lemon {
    31 
    32 
    33   
    34   ///Default traits class of Bfs class.
    35 
    36   ///Default traits class of Bfs class.
    37   ///\param GR Graph type.
    38   template<class GR>
    39   struct BfsDefaultTraits
    40   {
    41     ///The graph type the algorithm runs on. 
    42     typedef GR Graph;
    43     ///\brief The type of the map that stores the last
    44     ///edges of the shortest paths.
    45     /// 
    46     ///The type of the map that stores the last
    47     ///edges of the shortest paths.
    48     ///It must meet the \ref concept::WriteMap "WriteMap" concept.
    49     ///
    50     typedef typename Graph::template NodeMap<typename GR::Edge> PredMap;
    51     ///Instantiates a PredMap.
    52  
    53     ///This function instantiates a \ref PredMap. 
    54     ///\param G is the graph, to which we would like to define the PredMap.
    55     ///\todo The graph alone may be insufficient to initialize
    56     static PredMap *createPredMap(const GR &G) 
    57     {
    58       return new PredMap(G);
    59     }
    60 //     ///\brief The type of the map that stores the last but one
    61 //     ///nodes of the shortest paths.
    62 //     ///
    63 //     ///The type of the map that stores the last but one
    64 //     ///nodes of the shortest paths.
    65 //     ///It must meet the \ref concept::WriteMap "WriteMap" concept.
    66 //     ///
    67 //     typedef NullMap<typename Graph::Node,typename Graph::Node> PredNodeMap;
    68 //     ///Instantiates a PredNodeMap.
    69     
    70 //     ///This function instantiates a \ref PredNodeMap. 
    71 //     ///\param G is the graph, to which
    72 //     ///we would like to define the \ref PredNodeMap
    73 //     static PredNodeMap *createPredNodeMap(const GR &G)
    74 //     {
    75 //       return new PredNodeMap();
    76 //     }
    77 
    78     ///The type of the map that indicates which nodes are processed.
    79  
    80     ///The type of the map that indicates which nodes are processed.
    81     ///It must meet the \ref concept::WriteMap "WriteMap" concept.
    82     ///\todo named parameter to set this type, function to read and write.
    83     typedef NullMap<typename Graph::Node,bool> ProcessedMap;
    84     ///Instantiates a ProcessedMap.
    85  
    86     ///This function instantiates a \ref ProcessedMap. 
    87     ///\param G is the graph, to which
    88     ///we would like to define the \ref ProcessedMap
    89     static ProcessedMap *createProcessedMap(const GR &G)
    90     {
    91       return new ProcessedMap();
    92     }
    93     ///The type of the map that indicates which nodes are reached.
    94  
    95     ///The type of the map that indicates which nodes are reached.
    96     ///It must meet the \ref concept::WriteMap "WriteMap" concept.
    97     ///\todo named parameter to set this type, function to read and write.
    98     typedef typename Graph::template NodeMap<bool> ReachedMap;
    99     ///Instantiates a ReachedMap.
   100  
   101     ///This function instantiates a \ref ReachedMap. 
   102     ///\param G is the graph, to which
   103     ///we would like to define the \ref ReachedMap.
   104     static ReachedMap *createReachedMap(const GR &G)
   105     {
   106       return new ReachedMap(G);
   107     }
   108     ///The type of the map that stores the dists of the nodes.
   109  
   110     ///The type of the map that stores the dists of the nodes.
   111     ///It must meet the \ref concept::WriteMap "WriteMap" concept.
   112     ///
   113     typedef typename Graph::template NodeMap<int> DistMap;
   114     ///Instantiates a DistMap.
   115  
   116     ///This function instantiates a \ref DistMap. 
   117     ///\param G is the graph, to which we would like to define the \ref DistMap
   118     static DistMap *createDistMap(const GR &G)
   119     {
   120       return new DistMap(G);
   121     }
   122   };
   123   
   124   ///%BFS algorithm class.
   125   
   126   ///\ingroup flowalgs
   127   ///This class provides an efficient implementation of the %BFS algorithm.
   128   ///
   129   ///\param GR The graph type the algorithm runs on. The default value is
   130   ///\ref ListGraph. The value of GR is not used directly by Bfs, it
   131   ///is only passed to \ref BfsDefaultTraits.
   132   ///\param TR Traits class to set various data types used by the algorithm.
   133   ///The default traits class is
   134   ///\ref BfsDefaultTraits "BfsDefaultTraits<GR>".
   135   ///See \ref BfsDefaultTraits for the documentation of
   136   ///a Bfs traits class.
   137   ///
   138   ///\author Jacint Szabo and Alpar Juttner
   139   ///\todo A compare object would be nice.
   140 
   141 #ifdef DOXYGEN
   142   template <typename GR,
   143 	    typename TR>
   144 #else
   145   template <typename GR=ListGraph,
   146 	    typename TR=BfsDefaultTraits<GR> >
   147 #endif
   148   class Bfs {
   149   public:
   150     /**
   151      * \brief \ref Exception for uninitialized parameters.
   152      *
   153      * This error represents problems in the initialization
   154      * of the parameters of the algorithms.
   155      */
   156     class UninitializedParameter : public lemon::UninitializedParameter {
   157     public:
   158       virtual const char* exceptionName() const {
   159 	return "lemon::Bfs::UninitializedParameter";
   160       }
   161     };
   162 
   163     typedef TR Traits;
   164     ///The type of the underlying graph.
   165     typedef typename TR::Graph Graph;
   166     ///\e
   167     typedef typename Graph::Node Node;
   168     ///\e
   169     typedef typename Graph::NodeIt NodeIt;
   170     ///\e
   171     typedef typename Graph::Edge Edge;
   172     ///\e
   173     typedef typename Graph::OutEdgeIt OutEdgeIt;
   174     
   175     ///\brief The type of the map that stores the last
   176     ///edges of the shortest paths.
   177     typedef typename TR::PredMap PredMap;
   178 //     ///\brief The type of the map that stores the last but one
   179 //     ///nodes of the shortest paths.
   180 //     typedef typename TR::PredNodeMap PredNodeMap;
   181     ///The type of the map indicating which nodes are reached.
   182     typedef typename TR::ReachedMap ReachedMap;
   183     ///The type of the map indicating which nodes are processed.
   184     typedef typename TR::ProcessedMap ProcessedMap;
   185     ///The type of the map that stores the dists of the nodes.
   186     typedef typename TR::DistMap DistMap;
   187   private:
   188     /// Pointer to the underlying graph.
   189     const Graph *G;
   190     ///Pointer to the map of predecessors edges.
   191     PredMap *_pred;
   192     ///Indicates if \ref _pred is locally allocated (\c true) or not.
   193     bool local_pred;
   194 //     ///Pointer to the map of predecessors nodes.
   195 //     PredNodeMap *_predNode;
   196 //     ///Indicates if \ref _predNode is locally allocated (\c true) or not.
   197 //     bool local_predNode;
   198     ///Pointer to the map of distances.
   199     DistMap *_dist;
   200     ///Indicates if \ref _dist is locally allocated (\c true) or not.
   201     bool local_dist;
   202     ///Pointer to the map of reached status of the nodes.
   203     ReachedMap *_reached;
   204     ///Indicates if \ref _reached is locally allocated (\c true) or not.
   205     bool local_reached;
   206     ///Pointer to the map of processed status of the nodes.
   207     ProcessedMap *_processed;
   208     ///Indicates if \ref _processed is locally allocated (\c true) or not.
   209     bool local_processed;
   210 
   211     std::vector<typename Graph::Node> _queue;
   212     int _queue_head,_queue_tail,_queue_next_dist;
   213     int _curr_dist;
   214 //     ///The source node of the last execution.
   215 //     Node source;
   216 
   217     ///Creates the maps if necessary.
   218     
   219     ///\todo Error if \c G are \c NULL.
   220     ///\todo Better memory allocation (instead of new).
   221     void create_maps() 
   222     {
   223       if(!_pred) {
   224 	local_pred = true;
   225 	_pred = Traits::createPredMap(*G);
   226       }
   227 //       if(!_predNode) {
   228 // 	local_predNode = true;
   229 // 	_predNode = Traits::createPredNodeMap(*G);
   230 //       }
   231       if(!_dist) {
   232 	local_dist = true;
   233 	_dist = Traits::createDistMap(*G);
   234       }
   235       if(!_reached) {
   236 	local_reached = true;
   237 	_reached = Traits::createReachedMap(*G);
   238       }
   239       if(!_processed) {
   240 	local_processed = true;
   241 	_processed = Traits::createProcessedMap(*G);
   242       }
   243     }
   244     
   245   public :
   246  
   247     ///\name Named template parameters
   248 
   249     ///@{
   250 
   251     template <class T>
   252     struct DefPredMapTraits : public Traits {
   253       typedef T PredMap;
   254       static PredMap *createPredMap(const Graph &G) 
   255       {
   256 	throw UninitializedParameter();
   257       }
   258     };
   259     ///\ref named-templ-param "Named parameter" for setting PredMap type
   260 
   261     ///\ref named-templ-param "Named parameter" for setting PredMap type
   262     ///
   263     template <class T>
   264     class DefPredMap : public Bfs< Graph,
   265 					DefPredMapTraits<T> > { };
   266     
   267 //     template <class T>
   268 //     struct DefPredNodeMapTraits : public Traits {
   269 //       typedef T PredNodeMap;
   270 //       static PredNodeMap *createPredNodeMap(const Graph &G) 
   271 //       {
   272 // 	throw UninitializedParameter();
   273 //       }
   274 //     };
   275 //     ///\ref named-templ-param "Named parameter" for setting PredNodeMap type
   276 
   277 //     ///\ref named-templ-param "Named parameter" for setting PredNodeMap type
   278 //     ///
   279 //     template <class T>
   280 //     class DefPredNodeMap : public Bfs< Graph,
   281 // 					    LengthMap,
   282 // 					    DefPredNodeMapTraits<T> > { };
   283     
   284     template <class T>
   285     struct DefDistMapTraits : public Traits {
   286       typedef T DistMap;
   287       static DistMap *createDistMap(const Graph &G) 
   288       {
   289 	throw UninitializedParameter();
   290       }
   291     };
   292     ///\ref named-templ-param "Named parameter" for setting DistMap type
   293 
   294     ///\ref named-templ-param "Named parameter" for setting DistMap type
   295     ///
   296     template <class T>
   297     class DefDistMap : public Bfs< Graph,
   298 				   DefDistMapTraits<T> > { };
   299     
   300     template <class T>
   301     struct DefReachedMapTraits : public Traits {
   302       typedef T ReachedMap;
   303       static ReachedMap *createReachedMap(const Graph &G) 
   304       {
   305 	throw UninitializedParameter();
   306       }
   307     };
   308     ///\ref named-templ-param "Named parameter" for setting ReachedMap type
   309 
   310     ///\ref named-templ-param "Named parameter" for setting ReachedMap type
   311     ///
   312     template <class T>
   313     class DefReachedMap : public Bfs< Graph,
   314 				      DefReachedMapTraits<T> > { };
   315     
   316     struct DefGraphReachedMapTraits : public Traits {
   317       typedef typename Graph::template NodeMap<bool> ReachedMap;
   318       static ReachedMap *createReachedMap(const Graph &G) 
   319       {
   320 	return new ReachedMap(G);
   321       }
   322     };
   323     template <class T>
   324     struct DefProcessedMapTraits : public Traits {
   325       typedef T ProcessedMap;
   326       static ProcessedMap *createProcessedMap(const Graph &G) 
   327       {
   328 	throw UninitializedParameter();
   329       }
   330     };
   331     ///\ref named-templ-param "Named parameter" for setting ProcessedMap type
   332 
   333     ///\ref named-templ-param "Named parameter" for setting ProcessedMap type
   334     ///
   335     template <class T>
   336     class DefProcessedMap : public Bfs< Graph,
   337 					DefProcessedMapTraits<T> > { };
   338     
   339     struct DefGraphProcessedMapTraits : public Traits {
   340       typedef typename Graph::template NodeMap<bool> ProcessedMap;
   341       static ProcessedMap *createProcessedMap(const Graph &G) 
   342       {
   343 	return new ProcessedMap(G);
   344       }
   345     };
   346     ///\brief \ref named-templ-param "Named parameter"
   347     ///for setting the ProcessedMap type to be Graph::NodeMap<bool>.
   348     ///
   349     ///\ref named-templ-param "Named parameter"
   350     ///for setting the ProcessedMap type to be Graph::NodeMap<bool>.
   351     ///If you don't set it explicitely, it will be automatically allocated.
   352     template <class T>
   353     class DefProcessedMapToBeDefaultMap :
   354       public Bfs< Graph,
   355 		  DefGraphProcessedMapTraits> { };
   356     
   357     ///@}
   358 
   359   public:      
   360     
   361     ///Constructor.
   362     
   363     ///\param _G the graph the algorithm will run on.
   364     ///
   365     Bfs(const Graph& _G) :
   366       G(&_G),
   367       _pred(NULL), local_pred(false),
   368 //       _predNode(NULL), local_predNode(false),
   369       _dist(NULL), local_dist(false),
   370       _reached(NULL), local_reached(false),
   371       _processed(NULL), local_processed(false)
   372     { }
   373     
   374     ///Destructor.
   375     ~Bfs() 
   376     {
   377       if(local_pred) delete _pred;
   378 //       if(local_predNode) delete _predNode;
   379       if(local_dist) delete _dist;
   380       if(local_reached) delete _reached;
   381       if(local_processed) delete _processed;
   382     }
   383 
   384     ///Sets the map storing the predecessor edges.
   385 
   386     ///Sets the map storing the predecessor edges.
   387     ///If you don't use this function before calling \ref run(),
   388     ///it will allocate one. The destuctor deallocates this
   389     ///automatically allocated map, of course.
   390     ///\return <tt> (*this) </tt>
   391     Bfs &predMap(PredMap &m) 
   392     {
   393       if(local_pred) {
   394 	delete _pred;
   395 	local_pred=false;
   396       }
   397       _pred = &m;
   398       return *this;
   399     }
   400 
   401     ///Sets the map indicating the reached nodes.
   402 
   403     ///Sets the map indicating the reached nodes.
   404     ///If you don't use this function before calling \ref run(),
   405     ///it will allocate one. The destuctor deallocates this
   406     ///automatically allocated map, of course.
   407     ///\return <tt> (*this) </tt>
   408     Bfs &reachedMap(ReachedMap &m) 
   409     {
   410       if(local_reached) {
   411 	delete _reached;
   412 	local_reached=false;
   413       }
   414       _reached = &m;
   415       return *this;
   416     }
   417 
   418     ///Sets the map indicating the processed nodes.
   419 
   420     ///Sets the map indicating the processed nodes.
   421     ///If you don't use this function before calling \ref run(),
   422     ///it will allocate one. The destuctor deallocates this
   423     ///automatically allocated map, of course.
   424     ///\return <tt> (*this) </tt>
   425     Bfs &processedMap(ProcessedMap &m) 
   426     {
   427       if(local_processed) {
   428 	delete _processed;
   429 	local_processed=false;
   430       }
   431       _processed = &m;
   432       return *this;
   433     }
   434 
   435 //     ///Sets the map storing the predecessor nodes.
   436 
   437 //     ///Sets the map storing the predecessor nodes.
   438 //     ///If you don't use this function before calling \ref run(),
   439 //     ///it will allocate one. The destuctor deallocates this
   440 //     ///automatically allocated map, of course.
   441 //     ///\return <tt> (*this) </tt>
   442 //     Bfs &predNodeMap(PredNodeMap &m) 
   443 //     {
   444 //       if(local_predNode) {
   445 // 	delete _predNode;
   446 // 	local_predNode=false;
   447 //       }
   448 //       _predNode = &m;
   449 //       return *this;
   450 //     }
   451 
   452     ///Sets the map storing the distances calculated by the algorithm.
   453 
   454     ///Sets the map storing the distances calculated by the algorithm.
   455     ///If you don't use this function before calling \ref run(),
   456     ///it will allocate one. The destuctor deallocates this
   457     ///automatically allocated map, of course.
   458     ///\return <tt> (*this) </tt>
   459     Bfs &distMap(DistMap &m) 
   460     {
   461       if(local_dist) {
   462 	delete _dist;
   463 	local_dist=false;
   464       }
   465       _dist = &m;
   466       return *this;
   467     }
   468 
   469   public:
   470     ///\name Execution control
   471     ///The simplest way to execute the algorithm is to use
   472     ///one of the member functions called \c run(...).
   473     ///\n
   474     ///If you need more control on the execution,
   475     ///first you must call \ref init(), then you can add several source nodes
   476     ///with \ref addSource().
   477     ///Finally \ref start() will perform the actual path
   478     ///computation.
   479 
   480     ///@{
   481 
   482     ///Initializes the internal data structures.
   483 
   484     ///Initializes the internal data structures.
   485     ///
   486     void init()
   487     {
   488       create_maps();
   489       _queue.resize(countNodes(*G));
   490       _queue_head=_queue_tail=0;
   491       _curr_dist=1;
   492       for ( NodeIt u(*G) ; u!=INVALID ; ++u ) {
   493 	_pred->set(u,INVALID);
   494 // 	_predNode->set(u,INVALID);
   495 	_reached->set(u,false);
   496 	_processed->set(u,false);
   497       }
   498     }
   499     
   500     ///Adds a new source node.
   501 
   502     ///Adds a new source node to the set of nodes to be processed.
   503     ///
   504     void addSource(Node s)
   505     {
   506       if(!(*_reached)[s])
   507 	{
   508 	  _reached->set(s,true);
   509 	  _pred->set(s,INVALID);
   510 	  _dist->set(s,0);
   511 	  _queue[_queue_head++]=s;
   512 	  _queue_next_dist=_queue_head;
   513 	}
   514     }
   515     
   516     ///Processes the next node.
   517 
   518     ///Processes the next node.
   519     ///
   520     ///\warning The queue must not be empty!
   521     void processNextNode()
   522     {
   523       if(_queue_tail==_queue_next_dist) {
   524 	_curr_dist++;
   525 	_queue_next_dist=_queue_head;
   526       }
   527       Node n=_queue[_queue_tail++];
   528       _processed->set(n,true);
   529       Node m;
   530       for(OutEdgeIt e(*G,n);e!=INVALID;++e)
   531 	if(!(*_reached)[m=G->target(e)]) {
   532 	  _queue[_queue_head++]=m;
   533 	  _reached->set(m,true);
   534 	  _pred->set(m,e);
   535 // 	  _pred_node->set(m,n);
   536 	  _dist->set(m,_curr_dist);
   537 	}
   538     }
   539       
   540     ///\brief Returns \c false if there are nodes
   541     ///to be processed in the queue
   542     ///
   543     ///Returns \c false if there are nodes
   544     ///to be processed in the queue
   545     bool emptyQueue() { return _queue_tail==_queue_head; }
   546     ///Returns the number of the nodes to be processed.
   547     
   548     ///Returns the number of the nodes to be processed in the queue.
   549     ///
   550     int queueSize() { return _queue_head-_queue_tail; }
   551     
   552     ///Executes the algorithm.
   553 
   554     ///Executes the algorithm.
   555     ///
   556     ///\pre init() must be called and at least one node should be added
   557     ///with addSource() before using this function.
   558     ///
   559     ///This method runs the %BFS algorithm from the root node(s)
   560     ///in order to
   561     ///compute the
   562     ///shortest path to each node. The algorithm computes
   563     ///- The shortest path tree.
   564     ///- The distance of each node from the root(s).
   565     ///
   566     void start()
   567     {
   568       while ( !emptyQueue() ) processNextNode();
   569     }
   570     
   571     ///Executes the algorithm until \c dest is reached.
   572 
   573     ///Executes the algorithm until \c dest is reached.
   574     ///
   575     ///\pre init() must be called and at least one node should be added
   576     ///with addSource() before using this function.
   577     ///
   578     ///This method runs the %BFS algorithm from the root node(s)
   579     ///in order to
   580     ///compute the
   581     ///shortest path to \c dest. The algorithm computes
   582     ///- The shortest path to \c  dest.
   583     ///- The distance of \c dest from the root(s).
   584     ///
   585     void start(Node dest)
   586     {
   587       while ( !emptyQueue() && _queue[_queue_tail]!=dest ) processNextNode();
   588     }
   589     
   590     ///Executes the algorithm until a condition is met.
   591 
   592     ///Executes the algorithm until a condition is met.
   593     ///
   594     ///\pre init() must be called and at least one node should be added
   595     ///with addSource() before using this function.
   596     ///
   597     ///\param nm must be a bool (or convertible) node map. The algorithm
   598     ///will stop when it reaches a node \c v with <tt>nm[v]==true</tt>.
   599     template<class NM>
   600       void start(const NM &nm)
   601       {
   602 	while ( !emptyQueue() && !nm[_queue[_queue_tail]] ) processNextNode();
   603       }
   604     
   605     ///Runs %BFS algorithm from node \c s.
   606     
   607     ///This method runs the %BFS algorithm from a root node \c s
   608     ///in order to
   609     ///compute the
   610     ///shortest path to each node. The algorithm computes
   611     ///- The shortest path tree.
   612     ///- The distance of each node from the root.
   613     ///
   614     ///\note d.run(s) is just a shortcut of the following code.
   615     ///\code
   616     ///  d.init();
   617     ///  d.addSource(s);
   618     ///  d.start();
   619     ///\endcode
   620     void run(Node s) {
   621       init();
   622       addSource(s);
   623       start();
   624     }
   625     
   626     ///Finds the shortest path between \c s and \c t.
   627     
   628     ///Finds the shortest path between \c s and \c t.
   629     ///
   630     ///\return The length of the shortest s---t path if there exists one,
   631     ///0 otherwise.
   632     ///\note Apart from the return value, d.run(s) is
   633     ///just a shortcut of the following code.
   634     ///\code
   635     ///  d.init();
   636     ///  d.addSource(s);
   637     ///  d.start(t);
   638     ///\endcode
   639     int run(Node s,Node t) {
   640       init();
   641       addSource(s);
   642       start(t);
   643       return reached(t)?_curr_dist-1+(_queue_tail==_queue_next_dist):0;
   644     }
   645     
   646     ///@}
   647 
   648     ///\name Query Functions
   649     ///The result of the %BFS algorithm can be obtained using these
   650     ///functions.\n
   651     ///Before the use of these functions,
   652     ///either run() or start() must be called.
   653     
   654     ///@{
   655 
   656     ///The distance of a node from the root(s).
   657 
   658     ///Returns the distance of a node from the root(s).
   659     ///\pre \ref run() must be called before using this function.
   660     ///\warning If node \c v in unreachable from the root(s) the return value
   661     ///of this funcion is undefined.
   662     int dist(Node v) const { return (*_dist)[v]; }
   663 
   664     ///Returns the 'previous edge' of the shortest path tree.
   665 
   666     ///For a node \c v it returns the 'previous edge'
   667     ///of the shortest path tree,
   668     ///i.e. it returns the last edge of a shortest path from the root(s) to \c
   669     ///v. It is \ref INVALID
   670     ///if \c v is unreachable from the root(s) or \c v is a root. The
   671     ///shortest path tree used here is equal to the shortest path tree used in
   672     ///\ref predNode(Node v).
   673     ///\pre Either \ref run() or \ref start() must be called before using
   674     ///this function.
   675     ///\todo predEdge could be a better name.
   676     Edge pred(Node v) const { return (*_pred)[v];}
   677 
   678     ///Returns the 'previous node' of the shortest path tree.
   679 
   680     ///For a node \c v it returns the 'previous node'
   681     ///of the shortest path tree,
   682     ///i.e. it returns the last but one node from a shortest path from the
   683     ///root(a) to \c /v.
   684     ///It is INVALID if \c v is unreachable from the root(s) or
   685     ///if \c v itself a root.
   686     ///The shortest path tree used here is equal to the shortest path
   687     ///tree used in \ref pred(Node v).
   688     ///\pre Either \ref run() or \ref start() must be called before
   689     ///using this function.
   690     Node predNode(Node v) const { return (*_pred)[v]==INVALID ? INVALID:
   691 				  G->source((*_pred)[v]); }
   692     
   693     ///Returns a reference to the NodeMap of distances.
   694 
   695     ///Returns a reference to the NodeMap of distances.
   696     ///\pre Either \ref run() or \ref init() must
   697     ///be called before using this function.
   698     const DistMap &distMap() const { return *_dist;}
   699  
   700     ///Returns a reference to the shortest path tree map.
   701 
   702     ///Returns a reference to the NodeMap of the edges of the
   703     ///shortest path tree.
   704     ///\pre Either \ref run() or \ref init()
   705     ///must be called before using this function.
   706     const PredMap &predMap() const { return *_pred;}
   707  
   708 //     ///Returns a reference to the map of nodes of shortest paths.
   709 
   710 //     ///Returns a reference to the NodeMap of the last but one nodes of the
   711 //     ///shortest path tree.
   712 //     ///\pre \ref run() must be called before using this function.
   713 //     const PredNodeMap &predNodeMap() const { return *_predNode;}
   714 
   715     ///Checks if a node is reachable from the root.
   716 
   717     ///Returns \c true if \c v is reachable from the root.
   718     ///\warning The source nodes are inditated as unreached.
   719     ///\pre Either \ref run() or \ref start()
   720     ///must be called before using this function.
   721     ///
   722     bool reached(Node v) { return (*_reached)[v]; }
   723     
   724     ///@}
   725   };
   726 
   727   ///Default traits class of Bfs function.
   728 
   729   ///Default traits class of Bfs function.
   730   ///\param GR Graph type.
   731   template<class GR>
   732   struct BfsWizardDefaultTraits
   733   {
   734     ///The graph type the algorithm runs on. 
   735     typedef GR Graph;
   736     ///\brief The type of the map that stores the last
   737     ///edges of the shortest paths.
   738     /// 
   739     ///The type of the map that stores the last
   740     ///edges of the shortest paths.
   741     ///It must meet the \ref concept::WriteMap "WriteMap" concept.
   742     ///
   743     typedef NullMap<typename Graph::Node,typename GR::Edge> PredMap;
   744     ///Instantiates a PredMap.
   745  
   746     ///This function instantiates a \ref PredMap. 
   747     ///\param G is the graph, to which we would like to define the PredMap.
   748     ///\todo The graph alone may be insufficient to initialize
   749     static PredMap *createPredMap(const GR &G) 
   750     {
   751       return new PredMap();
   752     }
   753 //     ///\brief The type of the map that stores the last but one
   754 //     ///nodes of the shortest paths.
   755 //     ///
   756 //     ///The type of the map that stores the last but one
   757 //     ///nodes of the shortest paths.
   758 //     ///It must meet the \ref concept::WriteMap "WriteMap" concept.
   759 //     ///
   760 //     typedef NullMap<typename Graph::Node,typename Graph::Node> PredNodeMap;
   761 //     ///Instantiates a PredNodeMap.
   762     
   763 //     ///This function instantiates a \ref PredNodeMap. 
   764 //     ///\param G is the graph, to which
   765 //     ///we would like to define the \ref PredNodeMap
   766 //     static PredNodeMap *createPredNodeMap(const GR &G)
   767 //     {
   768 //       return new PredNodeMap();
   769 //     }
   770 
   771     ///The type of the map that indicates which nodes are processed.
   772  
   773     ///The type of the map that indicates which nodes are processed.
   774     ///It must meet the \ref concept::WriteMap "WriteMap" concept.
   775     ///\todo named parameter to set this type, function to read and write.
   776     typedef NullMap<typename Graph::Node,bool> ProcessedMap;
   777     ///Instantiates a ProcessedMap.
   778  
   779     ///This function instantiates a \ref ProcessedMap. 
   780     ///\param G is the graph, to which
   781     ///we would like to define the \ref ProcessedMap
   782     static ProcessedMap *createProcessedMap(const GR &G)
   783     {
   784       return new ProcessedMap();
   785     }
   786     ///The type of the map that indicates which nodes are reached.
   787  
   788     ///The type of the map that indicates which nodes are reached.
   789     ///It must meet the \ref concept::WriteMap "WriteMap" concept.
   790     ///\todo named parameter to set this type, function to read and write.
   791     typedef typename Graph::template NodeMap<bool> ReachedMap;
   792     ///Instantiates a ReachedMap.
   793  
   794     ///This function instantiates a \ref ReachedMap. 
   795     ///\param G is the graph, to which
   796     ///we would like to define the \ref ReachedMap.
   797     static ReachedMap *createReachedMap(const GR &G)
   798     {
   799       return new ReachedMap(G);
   800     }
   801     ///The type of the map that stores the dists of the nodes.
   802  
   803     ///The type of the map that stores the dists of the nodes.
   804     ///It must meet the \ref concept::WriteMap "WriteMap" concept.
   805     ///
   806     typedef NullMap<typename Graph::Node,int> DistMap;
   807     ///Instantiates a DistMap.
   808  
   809     ///This function instantiates a \ref DistMap. 
   810     ///\param G is the graph, to which we would like to define the \ref DistMap
   811     static DistMap *createDistMap(const GR &G)
   812     {
   813       return new DistMap();
   814     }
   815   };
   816   
   817   /// Default traits used by \ref BfsWizard
   818 
   819   /// To make it easier to use Bfs algorithm
   820   ///we have created a wizard class.
   821   /// This \ref BfsWizard class needs default traits,
   822   ///as well as the \ref Bfs class.
   823   /// The \ref BfsWizardBase is a class to be the default traits of the
   824   /// \ref BfsWizard class.
   825   template<class GR>
   826   class BfsWizardBase : public BfsWizardDefaultTraits<GR>
   827   {
   828 
   829     typedef BfsWizardDefaultTraits<GR> Base;
   830   protected:
   831     /// Type of the nodes in the graph.
   832     typedef typename Base::Graph::Node Node;
   833 
   834     /// Pointer to the underlying graph.
   835     void *_g;
   836     ///Pointer to the map of reached nodes.
   837     void *_reached;
   838     ///Pointer to the map of processed nodes.
   839     void *_processed;
   840     ///Pointer to the map of predecessors edges.
   841     void *_pred;
   842 //     ///Pointer to the map of predecessors nodes.
   843 //     void *_predNode;
   844     ///Pointer to the map of distances.
   845     void *_dist;
   846     ///Pointer to the source node.
   847     Node _source;
   848     
   849     public:
   850     /// Constructor.
   851     
   852     /// This constructor does not require parameters, therefore it initiates
   853     /// all of the attributes to default values (0, INVALID).
   854     BfsWizardBase() : _g(0), _reached(0), _processed(0), _pred(0),
   855 // 			   _predNode(0),
   856 			   _dist(0), _source(INVALID) {}
   857 
   858     /// Constructor.
   859     
   860     /// This constructor requires some parameters,
   861     /// listed in the parameters list.
   862     /// Others are initiated to 0.
   863     /// \param g is the initial value of  \ref _g
   864     /// \param s is the initial value of  \ref _source
   865     BfsWizardBase(const GR &g, Node s=INVALID) :
   866       _g((void *)&g), _reached(0), _processed(0), _pred(0),
   867 //       _predNode(0),
   868       _dist(0), _source(s) {}
   869 
   870   };
   871   
   872   /// A class to make the usage of Bfs algorithm easier
   873 
   874   /// This class is created to make it easier to use Bfs algorithm.
   875   /// It uses the functions and features of the plain \ref Bfs,
   876   /// but it is much simpler to use it.
   877   ///
   878   /// Simplicity means that the way to change the types defined
   879   /// in the traits class is based on functions that returns the new class
   880   /// and not on templatable built-in classes.
   881   /// When using the plain \ref Bfs
   882   /// the new class with the modified type comes from
   883   /// the original class by using the ::
   884   /// operator. In the case of \ref BfsWizard only
   885   /// a function have to be called and it will
   886   /// return the needed class.
   887   ///
   888   /// It does not have own \ref run method. When its \ref run method is called
   889   /// it initiates a plain \ref Bfs class, and calls the \ref Bfs::run
   890   /// method of it.
   891   template<class TR>
   892   class BfsWizard : public TR
   893   {
   894     typedef TR Base;
   895 
   896     ///The type of the underlying graph.
   897     typedef typename TR::Graph Graph;
   898     //\e
   899     typedef typename Graph::Node Node;
   900     //\e
   901     typedef typename Graph::NodeIt NodeIt;
   902     //\e
   903     typedef typename Graph::Edge Edge;
   904     //\e
   905     typedef typename Graph::OutEdgeIt OutEdgeIt;
   906     
   907     ///\brief The type of the map that stores
   908     ///the reached nodes
   909     typedef typename TR::ReachedMap ReachedMap;
   910     ///\brief The type of the map that stores
   911     ///the processed nodes
   912     typedef typename TR::ProcessedMap ProcessedMap;
   913     ///\brief The type of the map that stores the last
   914     ///edges of the shortest paths.
   915     typedef typename TR::PredMap PredMap;
   916 //     ///\brief The type of the map that stores the last but one
   917 //     ///nodes of the shortest paths.
   918 //     typedef typename TR::PredNodeMap PredNodeMap;
   919     ///The type of the map that stores the dists of the nodes.
   920     typedef typename TR::DistMap DistMap;
   921 
   922 public:
   923     /// Constructor.
   924     BfsWizard() : TR() {}
   925 
   926     /// Constructor that requires parameters.
   927 
   928     /// Constructor that requires parameters.
   929     /// These parameters will be the default values for the traits class.
   930     BfsWizard(const Graph &g, Node s=INVALID) :
   931       TR(g,s) {}
   932 
   933     ///Copy constructor
   934     BfsWizard(const TR &b) : TR(b) {}
   935 
   936     ~BfsWizard() {}
   937 
   938     ///Runs Bfs algorithm from a given node.
   939     
   940     ///Runs Bfs algorithm from a given node.
   941     ///The node can be given by the \ref source function.
   942     void run()
   943     {
   944       if(Base::_source==INVALID) throw UninitializedParameter();
   945       Bfs<Graph,TR> alg(*(Graph*)Base::_g);
   946       if(Base::_reached)
   947 	alg.reachedMap(*(ReachedMap*)Base::_reached);
   948       if(Base::_processed) alg.processedMap(*(ProcessedMap*)Base::_processed);
   949       if(Base::_pred) alg.predMap(*(PredMap*)Base::_pred);
   950 //       if(Base::_predNode) alg.predNodeMap(*(PredNodeMap*)Base::_predNode);
   951       if(Base::_dist) alg.distMap(*(DistMap*)Base::_dist);
   952       alg.run(Base::_source);
   953     }
   954 
   955     ///Runs Bfs algorithm from the given node.
   956 
   957     ///Runs Bfs algorithm from the given node.
   958     ///\param s is the given source.
   959     void run(Node s)
   960     {
   961       Base::_source=s;
   962       run();
   963     }
   964 
   965     template<class T>
   966     struct DefPredMapBase : public Base {
   967       typedef T PredMap;
   968       static PredMap *createPredMap(const Graph &G) { return 0; };
   969       DefPredMapBase(const TR &b) : TR(b) {}
   970     };
   971     
   972     ///\brief \ref named-templ-param "Named parameter"
   973     ///function for setting PredMap
   974     ///
   975     /// \ref named-templ-param "Named parameter"
   976     ///function for setting PredMap
   977     ///
   978     template<class T>
   979     BfsWizard<DefPredMapBase<T> > predMap(const T &t) 
   980     {
   981       Base::_pred=(void *)&t;
   982       return BfsWizard<DefPredMapBase<T> >(*this);
   983     }
   984     
   985  
   986     template<class T>
   987     struct DefReachedMapBase : public Base {
   988       typedef T ReachedMap;
   989       static ReachedMap *createReachedMap(const Graph &G) { return 0; };
   990       DefReachedMapBase(const TR &b) : TR(b) {}
   991     };
   992     
   993     ///\brief \ref named-templ-param "Named parameter"
   994     ///function for setting ReachedMap
   995     ///
   996     /// \ref named-templ-param "Named parameter"
   997     ///function for setting ReachedMap
   998     ///
   999     template<class T>
  1000     BfsWizard<DefReachedMapBase<T> > reachedMap(const T &t) 
  1001     {
  1002       Base::_pred=(void *)&t;
  1003       return BfsWizard<DefReachedMapBase<T> >(*this);
  1004     }
  1005     
  1006 
  1007     template<class T>
  1008     struct DefProcessedMapBase : public Base {
  1009       typedef T ProcessedMap;
  1010       static ProcessedMap *createProcessedMap(const Graph &G) { return 0; };
  1011       DefProcessedMapBase(const TR &b) : TR(b) {}
  1012     };
  1013     
  1014     ///\brief \ref named-templ-param "Named parameter"
  1015     ///function for setting ProcessedMap
  1016     ///
  1017     /// \ref named-templ-param "Named parameter"
  1018     ///function for setting ProcessedMap
  1019     ///
  1020     template<class T>
  1021     BfsWizard<DefProcessedMapBase<T> > processedMap(const T &t) 
  1022     {
  1023       Base::_pred=(void *)&t;
  1024       return BfsWizard<DefProcessedMapBase<T> >(*this);
  1025     }
  1026     
  1027 
  1028 //     template<class T>
  1029 //     struct DefPredNodeMapBase : public Base {
  1030 //       typedef T PredNodeMap;
  1031 //       static PredNodeMap *createPredNodeMap(const Graph &G) { return 0; };
  1032 //       DefPredNodeMapBase(const TR &b) : TR(b) {}
  1033 //     };
  1034     
  1035 //     ///\brief \ref named-templ-param "Named parameter"
  1036 //     ///function for setting PredNodeMap type
  1037 //     ///
  1038 //     /// \ref named-templ-param "Named parameter"
  1039 //     ///function for setting PredNodeMap type
  1040 //     ///
  1041 //     template<class T>
  1042 //     BfsWizard<DefPredNodeMapBase<T> > predNodeMap(const T &t) 
  1043 //     {
  1044 //       Base::_predNode=(void *)&t;
  1045 //       return BfsWizard<DefPredNodeMapBase<T> >(*this);
  1046 //     }
  1047    
  1048     template<class T>
  1049     struct DefDistMapBase : public Base {
  1050       typedef T DistMap;
  1051       static DistMap *createDistMap(const Graph &G) { return 0; };
  1052       DefDistMapBase(const TR &b) : TR(b) {}
  1053     };
  1054     
  1055     ///\brief \ref named-templ-param "Named parameter"
  1056     ///function for setting DistMap type
  1057     ///
  1058     /// \ref named-templ-param "Named parameter"
  1059     ///function for setting DistMap type
  1060     ///
  1061     template<class T>
  1062     BfsWizard<DefDistMapBase<T> > distMap(const T &t) 
  1063     {
  1064       Base::_dist=(void *)&t;
  1065       return BfsWizard<DefDistMapBase<T> >(*this);
  1066     }
  1067     
  1068     /// Sets the source node, from which the Bfs algorithm runs.
  1069 
  1070     /// Sets the source node, from which the Bfs algorithm runs.
  1071     /// \param s is the source node.
  1072     BfsWizard<TR> &source(Node s) 
  1073     {
  1074       Base::_source=s;
  1075       return *this;
  1076     }
  1077     
  1078   };
  1079   
  1080   ///Function type interface for Bfs algorithm.
  1081 
  1082   /// \ingroup flowalgs
  1083   ///Function type interface for Bfs algorithm.
  1084   ///
  1085   ///This function also has several
  1086   ///\ref named-templ-func-param "named parameters",
  1087   ///they are declared as the members of class \ref BfsWizard.
  1088   ///The following
  1089   ///example shows how to use these parameters.
  1090   ///\code
  1091   ///  bfs(g,source).predMap(preds).run();
  1092   ///\endcode
  1093   ///\warning Don't forget to put the \ref BfsWizard::run() "run()"
  1094   ///to the end of the parameter list.
  1095   ///\sa BfsWizard
  1096   ///\sa Bfs
  1097   template<class GR>
  1098   BfsWizard<BfsWizardBase<GR> >
  1099   bfs(const GR &g,typename GR::Node s=INVALID)
  1100   {
  1101     return BfsWizard<BfsWizardBase<GR> >(g,s);
  1102   }
  1103 
  1104 } //END OF NAMESPACE LEMON
  1105 
  1106 #endif
  1107