src/lemon/bfs.h
changeset 1435 8e85e6bbefdf
parent 1359 1581f961cfaa
equal deleted inserted replaced
10:614f6c63a976 -1:000000000000
     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