src/lemon/bfs.h
author ladanyi
Wed, 11 May 2005 16:55:18 +0000
changeset 1412 c7fab5a1174a
parent 1359 1581f961cfaa
permissions -rw-r--r--
moved the gui
     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 Research Group on Combinatorial Optimization, 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 &)
    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 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 explicitly, 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 destructor 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 destructor 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 destructor 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 destructor 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 destructor 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     ///Copies the shortest path to \c t into \c p
   657     
   658     ///This function copies the shortest path to \c t into \c p.
   659     ///If it \c \t is a source itself or unreachable, then it does not
   660     ///alter \c p.
   661     ///\todo Is it the right way to handle unreachable nodes?
   662     ///\return Returns \c true if a path to \c t was actually copied to \c p,
   663     ///\c false otherwise.
   664     ///\sa DirPath
   665     template<class P>
   666     bool getPath(P &p,Node t) 
   667     {
   668       if(reached(t)) {
   669 	p.clear();
   670 	typename P::Builder b(p);
   671 	for(b.setStartNode(t);pred(t)!=INVALID;t=predNode(t))
   672 	  b.pushFront(pred(t));
   673 	b.commit();
   674 	return true;
   675       }
   676       return false;
   677     }
   678 
   679     ///The distance of a node from the root(s).
   680 
   681     ///Returns the distance of a node from the root(s).
   682     ///\pre \ref run() must be called before using this function.
   683     ///\warning If node \c v in unreachable from the root(s) the return value
   684     ///of this function is undefined.
   685     int dist(Node v) const { return (*_dist)[v]; }
   686 
   687     ///Returns the 'previous edge' of the shortest path tree.
   688 
   689     ///For a node \c v it returns the 'previous edge'
   690     ///of the shortest path tree,
   691     ///i.e. it returns the last edge of a shortest path from the root(s) to \c
   692     ///v. It is \ref INVALID
   693     ///if \c v is unreachable from the root(s) or \c v is a root. The
   694     ///shortest path tree used here is equal to the shortest path tree used in
   695     ///\ref predNode(Node v).
   696     ///\pre Either \ref run() or \ref start() must be called before using
   697     ///this function.
   698     ///\todo predEdge could be a better name.
   699     Edge pred(Node v) const { return (*_pred)[v];}
   700 
   701     ///Returns the 'previous node' of the shortest path tree.
   702 
   703     ///For a node \c v it returns the 'previous node'
   704     ///of the shortest path tree,
   705     ///i.e. it returns the last but one node from a shortest path from the
   706     ///root(a) to \c /v.
   707     ///It is INVALID if \c v is unreachable from the root(s) or
   708     ///if \c v itself a root.
   709     ///The shortest path tree used here is equal to the shortest path
   710     ///tree used in \ref pred(Node v).
   711     ///\pre Either \ref run() or \ref start() must be called before
   712     ///using this function.
   713     Node predNode(Node v) const { return (*_pred)[v]==INVALID ? INVALID:
   714 				  G->source((*_pred)[v]); }
   715     
   716     ///Returns a reference to the NodeMap of distances.
   717 
   718     ///Returns a reference to the NodeMap of distances.
   719     ///\pre Either \ref run() or \ref init() must
   720     ///be called before using this function.
   721     const DistMap &distMap() const { return *_dist;}
   722  
   723     ///Returns a reference to the shortest path tree map.
   724 
   725     ///Returns a reference to the NodeMap of the edges of the
   726     ///shortest path tree.
   727     ///\pre Either \ref run() or \ref init()
   728     ///must be called before using this function.
   729     const PredMap &predMap() const { return *_pred;}
   730  
   731 //     ///Returns a reference to the map of nodes of shortest paths.
   732 
   733 //     ///Returns a reference to the NodeMap of the last but one nodes of the
   734 //     ///shortest path tree.
   735 //     ///\pre \ref run() must be called before using this function.
   736 //     const PredNodeMap &predNodeMap() const { return *_predNode;}
   737 
   738     ///Checks if a node is reachable from the root.
   739 
   740     ///Returns \c true if \c v is reachable from the root.
   741     ///\warning The source nodes are indicated as unreached.
   742     ///\pre Either \ref run() or \ref start()
   743     ///must be called before using this function.
   744     ///
   745     bool reached(Node v) { return (*_reached)[v]; }
   746     
   747     ///@}
   748   };
   749 
   750   ///Default traits class of Bfs function.
   751 
   752   ///Default traits class of Bfs function.
   753   ///\param GR Graph type.
   754   template<class GR>
   755   struct BfsWizardDefaultTraits
   756   {
   757     ///The graph type the algorithm runs on. 
   758     typedef GR Graph;
   759     ///\brief The type of the map that stores the last
   760     ///edges of the shortest paths.
   761     /// 
   762     ///The type of the map that stores the last
   763     ///edges of the shortest paths.
   764     ///It must meet the \ref concept::WriteMap "WriteMap" concept.
   765     ///
   766     typedef NullMap<typename Graph::Node,typename GR::Edge> PredMap;
   767     ///Instantiates a PredMap.
   768  
   769     ///This function instantiates a \ref PredMap. 
   770     ///\param G is the graph, to which we would like to define the PredMap.
   771     ///\todo The graph alone may be insufficient to initialize
   772     static PredMap *createPredMap(const GR &) 
   773     {
   774       return new PredMap();
   775     }
   776 //     ///\brief The type of the map that stores the last but one
   777 //     ///nodes of the shortest paths.
   778 //     ///
   779 //     ///The type of the map that stores the last but one
   780 //     ///nodes of the shortest paths.
   781 //     ///It must meet the \ref concept::WriteMap "WriteMap" concept.
   782 //     ///
   783 //     typedef NullMap<typename Graph::Node,typename Graph::Node> PredNodeMap;
   784 //     ///Instantiates a PredNodeMap.
   785     
   786 //     ///This function instantiates a \ref PredNodeMap. 
   787 //     ///\param G is the graph, to which
   788 //     ///we would like to define the \ref PredNodeMap
   789 //     static PredNodeMap *createPredNodeMap(const GR &G)
   790 //     {
   791 //       return new PredNodeMap();
   792 //     }
   793 
   794     ///The type of the map that indicates which nodes are processed.
   795  
   796     ///The type of the map that indicates which nodes are processed.
   797     ///It must meet the \ref concept::WriteMap "WriteMap" concept.
   798     ///\todo named parameter to set this type, function to read and write.
   799     typedef NullMap<typename Graph::Node,bool> ProcessedMap;
   800     ///Instantiates a ProcessedMap.
   801  
   802     ///This function instantiates a \ref ProcessedMap. 
   803     ///\param G is the graph, to which
   804     ///we would like to define the \ref ProcessedMap
   805     static ProcessedMap *createProcessedMap(const GR &)
   806     {
   807       return new ProcessedMap();
   808     }
   809     ///The type of the map that indicates which nodes are reached.
   810  
   811     ///The type of the map that indicates which nodes are reached.
   812     ///It must meet the \ref concept::WriteMap "WriteMap" concept.
   813     ///\todo named parameter to set this type, function to read and write.
   814     typedef typename Graph::template NodeMap<bool> ReachedMap;
   815     ///Instantiates a ReachedMap.
   816  
   817     ///This function instantiates a \ref ReachedMap. 
   818     ///\param G is the graph, to which
   819     ///we would like to define the \ref ReachedMap.
   820     static ReachedMap *createReachedMap(const GR &G)
   821     {
   822       return new ReachedMap(G);
   823     }
   824     ///The type of the map that stores the dists of the nodes.
   825  
   826     ///The type of the map that stores the dists of the nodes.
   827     ///It must meet the \ref concept::WriteMap "WriteMap" concept.
   828     ///
   829     typedef NullMap<typename Graph::Node,int> DistMap;
   830     ///Instantiates a DistMap.
   831  
   832     ///This function instantiates a \ref DistMap. 
   833     ///\param G is the graph, to which we would like to define the \ref DistMap
   834     static DistMap *createDistMap(const GR &)
   835     {
   836       return new DistMap();
   837     }
   838   };
   839   
   840   /// Default traits used by \ref BfsWizard
   841 
   842   /// To make it easier to use Bfs algorithm
   843   ///we have created a wizard class.
   844   /// This \ref BfsWizard class needs default traits,
   845   ///as well as the \ref Bfs class.
   846   /// The \ref BfsWizardBase is a class to be the default traits of the
   847   /// \ref BfsWizard class.
   848   template<class GR>
   849   class BfsWizardBase : public BfsWizardDefaultTraits<GR>
   850   {
   851 
   852     typedef BfsWizardDefaultTraits<GR> Base;
   853   protected:
   854     /// Type of the nodes in the graph.
   855     typedef typename Base::Graph::Node Node;
   856 
   857     /// Pointer to the underlying graph.
   858     void *_g;
   859     ///Pointer to the map of reached nodes.
   860     void *_reached;
   861     ///Pointer to the map of processed nodes.
   862     void *_processed;
   863     ///Pointer to the map of predecessors edges.
   864     void *_pred;
   865 //     ///Pointer to the map of predecessors nodes.
   866 //     void *_predNode;
   867     ///Pointer to the map of distances.
   868     void *_dist;
   869     ///Pointer to the source node.
   870     Node _source;
   871     
   872     public:
   873     /// Constructor.
   874     
   875     /// This constructor does not require parameters, therefore it initiates
   876     /// all of the attributes to default values (0, INVALID).
   877     BfsWizardBase() : _g(0), _reached(0), _processed(0), _pred(0),
   878 // 			   _predNode(0),
   879 			   _dist(0), _source(INVALID) {}
   880 
   881     /// Constructor.
   882     
   883     /// This constructor requires some parameters,
   884     /// listed in the parameters list.
   885     /// Others are initiated to 0.
   886     /// \param g is the initial value of  \ref _g
   887     /// \param s is the initial value of  \ref _source
   888     BfsWizardBase(const GR &g, Node s=INVALID) :
   889       _g((void *)&g), _reached(0), _processed(0), _pred(0),
   890 //       _predNode(0),
   891       _dist(0), _source(s) {}
   892 
   893   };
   894   
   895   /// A class to make the usage of Bfs algorithm easier
   896 
   897   /// This class is created to make it easier to use Bfs algorithm.
   898   /// It uses the functions and features of the plain \ref Bfs,
   899   /// but it is much simpler to use it.
   900   ///
   901   /// Simplicity means that the way to change the types defined
   902   /// in the traits class is based on functions that returns the new class
   903   /// and not on templatable built-in classes.
   904   /// When using the plain \ref Bfs
   905   /// the new class with the modified type comes from
   906   /// the original class by using the ::
   907   /// operator. In the case of \ref BfsWizard only
   908   /// a function have to be called and it will
   909   /// return the needed class.
   910   ///
   911   /// It does not have own \ref run method. When its \ref run method is called
   912   /// it initiates a plain \ref Bfs class, and calls the \ref Bfs::run
   913   /// method of it.
   914   template<class TR>
   915   class BfsWizard : public TR
   916   {
   917     typedef TR Base;
   918 
   919     ///The type of the underlying graph.
   920     typedef typename TR::Graph Graph;
   921     //\e
   922     typedef typename Graph::Node Node;
   923     //\e
   924     typedef typename Graph::NodeIt NodeIt;
   925     //\e
   926     typedef typename Graph::Edge Edge;
   927     //\e
   928     typedef typename Graph::OutEdgeIt OutEdgeIt;
   929     
   930     ///\brief The type of the map that stores
   931     ///the reached nodes
   932     typedef typename TR::ReachedMap ReachedMap;
   933     ///\brief The type of the map that stores
   934     ///the processed nodes
   935     typedef typename TR::ProcessedMap ProcessedMap;
   936     ///\brief The type of the map that stores the last
   937     ///edges of the shortest paths.
   938     typedef typename TR::PredMap PredMap;
   939 //     ///\brief The type of the map that stores the last but one
   940 //     ///nodes of the shortest paths.
   941 //     typedef typename TR::PredNodeMap PredNodeMap;
   942     ///The type of the map that stores the dists of the nodes.
   943     typedef typename TR::DistMap DistMap;
   944 
   945 public:
   946     /// Constructor.
   947     BfsWizard() : TR() {}
   948 
   949     /// Constructor that requires parameters.
   950 
   951     /// Constructor that requires parameters.
   952     /// These parameters will be the default values for the traits class.
   953     BfsWizard(const Graph &g, Node s=INVALID) :
   954       TR(g,s) {}
   955 
   956     ///Copy constructor
   957     BfsWizard(const TR &b) : TR(b) {}
   958 
   959     ~BfsWizard() {}
   960 
   961     ///Runs Bfs algorithm from a given node.
   962     
   963     ///Runs Bfs algorithm from a given node.
   964     ///The node can be given by the \ref source function.
   965     void run()
   966     {
   967       if(Base::_source==INVALID) throw UninitializedParameter();
   968       Bfs<Graph,TR> alg(*(Graph*)Base::_g);
   969       if(Base::_reached)
   970 	alg.reachedMap(*(ReachedMap*)Base::_reached);
   971       if(Base::_processed) alg.processedMap(*(ProcessedMap*)Base::_processed);
   972       if(Base::_pred) alg.predMap(*(PredMap*)Base::_pred);
   973 //       if(Base::_predNode) alg.predNodeMap(*(PredNodeMap*)Base::_predNode);
   974       if(Base::_dist) alg.distMap(*(DistMap*)Base::_dist);
   975       alg.run(Base::_source);
   976     }
   977 
   978     ///Runs Bfs algorithm from the given node.
   979 
   980     ///Runs Bfs algorithm from the given node.
   981     ///\param s is the given source.
   982     void run(Node s)
   983     {
   984       Base::_source=s;
   985       run();
   986     }
   987 
   988     template<class T>
   989     struct DefPredMapBase : public Base {
   990       typedef T PredMap;
   991       static PredMap *createPredMap(const Graph &) { return 0; };
   992       DefPredMapBase(const TR &b) : TR(b) {}
   993     };
   994     
   995     ///\brief \ref named-templ-param "Named parameter"
   996     ///function for setting PredMap
   997     ///
   998     /// \ref named-templ-param "Named parameter"
   999     ///function for setting PredMap
  1000     ///
  1001     template<class T>
  1002     BfsWizard<DefPredMapBase<T> > predMap(const T &t) 
  1003     {
  1004       Base::_pred=(void *)&t;
  1005       return BfsWizard<DefPredMapBase<T> >(*this);
  1006     }
  1007     
  1008  
  1009     template<class T>
  1010     struct DefReachedMapBase : public Base {
  1011       typedef T ReachedMap;
  1012       static ReachedMap *createReachedMap(const Graph &) { return 0; };
  1013       DefReachedMapBase(const TR &b) : TR(b) {}
  1014     };
  1015     
  1016     ///\brief \ref named-templ-param "Named parameter"
  1017     ///function for setting ReachedMap
  1018     ///
  1019     /// \ref named-templ-param "Named parameter"
  1020     ///function for setting ReachedMap
  1021     ///
  1022     template<class T>
  1023     BfsWizard<DefReachedMapBase<T> > reachedMap(const T &t) 
  1024     {
  1025       Base::_pred=(void *)&t;
  1026       return BfsWizard<DefReachedMapBase<T> >(*this);
  1027     }
  1028     
  1029 
  1030     template<class T>
  1031     struct DefProcessedMapBase : public Base {
  1032       typedef T ProcessedMap;
  1033       static ProcessedMap *createProcessedMap(const Graph &) { return 0; };
  1034       DefProcessedMapBase(const TR &b) : TR(b) {}
  1035     };
  1036     
  1037     ///\brief \ref named-templ-param "Named parameter"
  1038     ///function for setting ProcessedMap
  1039     ///
  1040     /// \ref named-templ-param "Named parameter"
  1041     ///function for setting ProcessedMap
  1042     ///
  1043     template<class T>
  1044     BfsWizard<DefProcessedMapBase<T> > processedMap(const T &t) 
  1045     {
  1046       Base::_pred=(void *)&t;
  1047       return BfsWizard<DefProcessedMapBase<T> >(*this);
  1048     }
  1049     
  1050 
  1051 //     template<class T>
  1052 //     struct DefPredNodeMapBase : public Base {
  1053 //       typedef T PredNodeMap;
  1054 //       static PredNodeMap *createPredNodeMap(const Graph &G) { return 0; };
  1055 //       DefPredNodeMapBase(const TR &b) : TR(b) {}
  1056 //     };
  1057     
  1058 //     ///\brief \ref named-templ-param "Named parameter"
  1059 //     ///function for setting PredNodeMap type
  1060 //     ///
  1061 //     /// \ref named-templ-param "Named parameter"
  1062 //     ///function for setting PredNodeMap type
  1063 //     ///
  1064 //     template<class T>
  1065 //     BfsWizard<DefPredNodeMapBase<T> > predNodeMap(const T &t) 
  1066 //     {
  1067 //       Base::_predNode=(void *)&t;
  1068 //       return BfsWizard<DefPredNodeMapBase<T> >(*this);
  1069 //     }
  1070    
  1071     template<class T>
  1072     struct DefDistMapBase : public Base {
  1073       typedef T DistMap;
  1074       static DistMap *createDistMap(const Graph &) { return 0; };
  1075       DefDistMapBase(const TR &b) : TR(b) {}
  1076     };
  1077     
  1078     ///\brief \ref named-templ-param "Named parameter"
  1079     ///function for setting DistMap type
  1080     ///
  1081     /// \ref named-templ-param "Named parameter"
  1082     ///function for setting DistMap type
  1083     ///
  1084     template<class T>
  1085     BfsWizard<DefDistMapBase<T> > distMap(const T &t) 
  1086     {
  1087       Base::_dist=(void *)&t;
  1088       return BfsWizard<DefDistMapBase<T> >(*this);
  1089     }
  1090     
  1091     /// Sets the source node, from which the Bfs algorithm runs.
  1092 
  1093     /// Sets the source node, from which the Bfs algorithm runs.
  1094     /// \param s is the source node.
  1095     BfsWizard<TR> &source(Node s) 
  1096     {
  1097       Base::_source=s;
  1098       return *this;
  1099     }
  1100     
  1101   };
  1102   
  1103   ///Function type interface for Bfs algorithm.
  1104 
  1105   /// \ingroup flowalgs
  1106   ///Function type interface for Bfs algorithm.
  1107   ///
  1108   ///This function also has several
  1109   ///\ref named-templ-func-param "named parameters",
  1110   ///they are declared as the members of class \ref BfsWizard.
  1111   ///The following
  1112   ///example shows how to use these parameters.
  1113   ///\code
  1114   ///  bfs(g,source).predMap(preds).run();
  1115   ///\endcode
  1116   ///\warning Don't forget to put the \ref BfsWizard::run() "run()"
  1117   ///to the end of the parameter list.
  1118   ///\sa BfsWizard
  1119   ///\sa Bfs
  1120   template<class GR>
  1121   BfsWizard<BfsWizardBase<GR> >
  1122   bfs(const GR &g,typename GR::Node s=INVALID)
  1123   {
  1124     return BfsWizard<BfsWizardBase<GR> >(g,s);
  1125   }
  1126 
  1127 } //END OF NAMESPACE LEMON
  1128 
  1129 #endif
  1130