lemon/bfs.h
author deba
Tue, 17 Oct 2006 10:50:57 +0000
changeset 2247 269a0dcee70b
parent 2033 7bf1f64962c2
child 2260 4274224f8a7d
permissions -rw-r--r--
Update the Path concept
Concept check for paths

DirPath renamed to Path
The interface updated to the new lemon interface
Make difference between the empty path and the path from one node
Builder interface have not been changed
// I wanted but there was not accordance about it

UPath is removed
It was a buggy implementation, it could not iterate on the
nodes in the right order
Right way to use undirected paths => path of edges in undirected graphs

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