gravatar
kpeter (Peter Kovacs)
kpeter@inf.elte.hu
Various doc improvements (#331) - Add notes to the graph classes about the time of item counting. - Clarify the doc for run() in BFS and DFS. - Other improvements.
0 11 0
default
11 files changed:
Changeset was too big and was cut off... Show full diff
↑ Collapse diff ↑
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5 5
 * Copyright (C) 2003-2009
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_ADAPTORS_H
20 20
#define LEMON_ADAPTORS_H
21 21

	
22 22
/// \ingroup graph_adaptors
23 23
/// \file
24 24
/// \brief Adaptor classes for digraphs and graphs
25 25
///
26 26
/// This file contains several useful adaptors for digraphs and graphs.
27 27

	
28 28
#include <lemon/core.h>
29 29
#include <lemon/maps.h>
30 30
#include <lemon/bits/variant.h>
31 31

	
32 32
#include <lemon/bits/graph_adaptor_extender.h>
33 33
#include <lemon/bits/map_extender.h>
34 34
#include <lemon/tolerance.h>
35 35

	
36 36
#include <algorithm>
37 37

	
38 38
namespace lemon {
39 39

	
40 40
#ifdef _MSC_VER
41 41
#define LEMON_SCOPE_FIX(OUTER, NESTED) OUTER::NESTED
42 42
#else
43 43
#define LEMON_SCOPE_FIX(OUTER, NESTED) typename OUTER::template NESTED
44 44
#endif
45 45

	
46 46
  template<typename DGR>
47 47
  class DigraphAdaptorBase {
48 48
  public:
49 49
    typedef DGR Digraph;
50 50
    typedef DigraphAdaptorBase Adaptor;
51 51

	
52 52
  protected:
53 53
    DGR* _digraph;
54 54
    DigraphAdaptorBase() : _digraph(0) { }
55 55
    void initialize(DGR& digraph) { _digraph = &digraph; }
56 56

	
57 57
  public:
58 58
    DigraphAdaptorBase(DGR& digraph) : _digraph(&digraph) { }
59 59

	
60 60
    typedef typename DGR::Node Node;
61 61
    typedef typename DGR::Arc Arc;
62 62

	
63 63
    void first(Node& i) const { _digraph->first(i); }
64 64
    void first(Arc& i) const { _digraph->first(i); }
65 65
    void firstIn(Arc& i, const Node& n) const { _digraph->firstIn(i, n); }
66 66
    void firstOut(Arc& i, const Node& n ) const { _digraph->firstOut(i, n); }
67 67

	
68 68
    void next(Node& i) const { _digraph->next(i); }
69 69
    void next(Arc& i) const { _digraph->next(i); }
70 70
    void nextIn(Arc& i) const { _digraph->nextIn(i); }
71 71
    void nextOut(Arc& i) const { _digraph->nextOut(i); }
72 72

	
73 73
    Node source(const Arc& a) const { return _digraph->source(a); }
74 74
    Node target(const Arc& a) const { return _digraph->target(a); }
75 75

	
76 76
    typedef NodeNumTagIndicator<DGR> NodeNumTag;
77 77
    int nodeNum() const { return _digraph->nodeNum(); }
78 78

	
79 79
    typedef ArcNumTagIndicator<DGR> ArcNumTag;
80 80
    int arcNum() const { return _digraph->arcNum(); }
81 81

	
82 82
    typedef FindArcTagIndicator<DGR> FindArcTag;
83 83
    Arc findArc(const Node& u, const Node& v, const Arc& prev = INVALID) const {
84 84
      return _digraph->findArc(u, v, prev);
85 85
    }
86 86

	
87 87
    Node addNode() { return _digraph->addNode(); }
88 88
    Arc addArc(const Node& u, const Node& v) { return _digraph->addArc(u, v); }
89 89

	
90 90
    void erase(const Node& n) { _digraph->erase(n); }
91 91
    void erase(const Arc& a) { _digraph->erase(a); }
92 92

	
93 93
    void clear() { _digraph->clear(); }
94 94

	
95 95
    int id(const Node& n) const { return _digraph->id(n); }
96 96
    int id(const Arc& a) const { return _digraph->id(a); }
97 97

	
98 98
    Node nodeFromId(int ix) const { return _digraph->nodeFromId(ix); }
99 99
    Arc arcFromId(int ix) const { return _digraph->arcFromId(ix); }
100 100

	
101 101
    int maxNodeId() const { return _digraph->maxNodeId(); }
102 102
    int maxArcId() const { return _digraph->maxArcId(); }
103 103

	
104 104
    typedef typename ItemSetTraits<DGR, Node>::ItemNotifier NodeNotifier;
105 105
    NodeNotifier& notifier(Node) const { return _digraph->notifier(Node()); }
106 106

	
107 107
    typedef typename ItemSetTraits<DGR, Arc>::ItemNotifier ArcNotifier;
108 108
    ArcNotifier& notifier(Arc) const { return _digraph->notifier(Arc()); }
109 109

	
110 110
    template <typename V>
111 111
    class NodeMap : public DGR::template NodeMap<V> {
112 112
      typedef typename DGR::template NodeMap<V> Parent;
113 113

	
114 114
    public:
115 115
      explicit NodeMap(const Adaptor& adaptor)
116 116
        : Parent(*adaptor._digraph) {}
117 117
      NodeMap(const Adaptor& adaptor, const V& value)
118 118
        : Parent(*adaptor._digraph, value) { }
119 119

	
120 120
    private:
121 121
      NodeMap& operator=(const NodeMap& cmap) {
122 122
        return operator=<NodeMap>(cmap);
123 123
      }
124 124

	
125 125
      template <typename CMap>
126 126
      NodeMap& operator=(const CMap& cmap) {
127 127
        Parent::operator=(cmap);
128 128
        return *this;
129 129
      }
130 130

	
131 131
    };
132 132

	
133 133
    template <typename V>
134 134
    class ArcMap : public DGR::template ArcMap<V> {
135 135
      typedef typename DGR::template ArcMap<V> Parent;
136 136

	
137 137
    public:
138 138
      explicit ArcMap(const DigraphAdaptorBase<DGR>& adaptor)
139 139
        : Parent(*adaptor._digraph) {}
140 140
      ArcMap(const DigraphAdaptorBase<DGR>& adaptor, const V& value)
141 141
        : Parent(*adaptor._digraph, value) {}
142 142

	
143 143
    private:
144 144
      ArcMap& operator=(const ArcMap& cmap) {
145 145
        return operator=<ArcMap>(cmap);
146 146
      }
147 147

	
148 148
      template <typename CMap>
149 149
      ArcMap& operator=(const CMap& cmap) {
150 150
        Parent::operator=(cmap);
151 151
        return *this;
152 152
      }
153 153

	
154 154
    };
155 155

	
156 156
  };
157 157

	
158 158
  template<typename GR>
159 159
  class GraphAdaptorBase {
160 160
  public:
161 161
    typedef GR Graph;
162 162

	
163 163
  protected:
164 164
    GR* _graph;
165 165

	
166 166
    GraphAdaptorBase() : _graph(0) {}
167 167

	
168 168
    void initialize(GR& graph) { _graph = &graph; }
169 169

	
170 170
  public:
171 171
    GraphAdaptorBase(GR& graph) : _graph(&graph) {}
172 172

	
173 173
    typedef typename GR::Node Node;
174 174
    typedef typename GR::Arc Arc;
175 175
    typedef typename GR::Edge Edge;
176 176

	
177 177
    void first(Node& i) const { _graph->first(i); }
178 178
    void first(Arc& i) const { _graph->first(i); }
179 179
    void first(Edge& i) const { _graph->first(i); }
180 180
    void firstIn(Arc& i, const Node& n) const { _graph->firstIn(i, n); }
181 181
    void firstOut(Arc& i, const Node& n ) const { _graph->firstOut(i, n); }
182 182
    void firstInc(Edge &i, bool &d, const Node &n) const {
183 183
      _graph->firstInc(i, d, n);
184 184
    }
185 185

	
186 186
    void next(Node& i) const { _graph->next(i); }
187 187
    void next(Arc& i) const { _graph->next(i); }
188 188
    void next(Edge& i) const { _graph->next(i); }
189 189
    void nextIn(Arc& i) const { _graph->nextIn(i); }
190 190
    void nextOut(Arc& i) const { _graph->nextOut(i); }
191 191
    void nextInc(Edge &i, bool &d) const { _graph->nextInc(i, d); }
192 192

	
193 193
    Node u(const Edge& e) const { return _graph->u(e); }
194 194
    Node v(const Edge& e) const { return _graph->v(e); }
195 195

	
196 196
    Node source(const Arc& a) const { return _graph->source(a); }
197 197
    Node target(const Arc& a) const { return _graph->target(a); }
198 198

	
199 199
    typedef NodeNumTagIndicator<Graph> NodeNumTag;
200 200
    int nodeNum() const { return _graph->nodeNum(); }
201 201

	
202 202
    typedef ArcNumTagIndicator<Graph> ArcNumTag;
203 203
    int arcNum() const { return _graph->arcNum(); }
204 204

	
205 205
    typedef EdgeNumTagIndicator<Graph> EdgeNumTag;
206 206
    int edgeNum() const { return _graph->edgeNum(); }
207 207

	
208 208
    typedef FindArcTagIndicator<Graph> FindArcTag;
209 209
    Arc findArc(const Node& u, const Node& v,
210 210
                const Arc& prev = INVALID) const {
211 211
      return _graph->findArc(u, v, prev);
212 212
    }
213 213

	
214 214
    typedef FindEdgeTagIndicator<Graph> FindEdgeTag;
215 215
    Edge findEdge(const Node& u, const Node& v,
216 216
                  const Edge& prev = INVALID) const {
217 217
      return _graph->findEdge(u, v, prev);
218 218
    }
219 219

	
220 220
    Node addNode() { return _graph->addNode(); }
221 221
    Edge addEdge(const Node& u, const Node& v) { return _graph->addEdge(u, v); }
222 222

	
223 223
    void erase(const Node& i) { _graph->erase(i); }
224 224
    void erase(const Edge& i) { _graph->erase(i); }
225 225

	
226 226
    void clear() { _graph->clear(); }
227 227

	
228 228
    bool direction(const Arc& a) const { return _graph->direction(a); }
229 229
    Arc direct(const Edge& e, bool d) const { return _graph->direct(e, d); }
230 230

	
231 231
    int id(const Node& v) const { return _graph->id(v); }
232 232
    int id(const Arc& a) const { return _graph->id(a); }
233 233
    int id(const Edge& e) const { return _graph->id(e); }
234 234

	
235 235
    Node nodeFromId(int ix) const { return _graph->nodeFromId(ix); }
236 236
    Arc arcFromId(int ix) const { return _graph->arcFromId(ix); }
237 237
    Edge edgeFromId(int ix) const { return _graph->edgeFromId(ix); }
238 238

	
239 239
    int maxNodeId() const { return _graph->maxNodeId(); }
240 240
    int maxArcId() const { return _graph->maxArcId(); }
241 241
    int maxEdgeId() const { return _graph->maxEdgeId(); }
242 242

	
243 243
    typedef typename ItemSetTraits<GR, Node>::ItemNotifier NodeNotifier;
244 244
    NodeNotifier& notifier(Node) const { return _graph->notifier(Node()); }
245 245

	
246 246
    typedef typename ItemSetTraits<GR, Arc>::ItemNotifier ArcNotifier;
247 247
    ArcNotifier& notifier(Arc) const { return _graph->notifier(Arc()); }
248 248

	
249 249
    typedef typename ItemSetTraits<GR, Edge>::ItemNotifier EdgeNotifier;
250 250
    EdgeNotifier& notifier(Edge) const { return _graph->notifier(Edge()); }
251 251

	
252 252
    template <typename V>
253 253
    class NodeMap : public GR::template NodeMap<V> {
254 254
      typedef typename GR::template NodeMap<V> Parent;
255 255

	
256 256
    public:
257 257
      explicit NodeMap(const GraphAdaptorBase<GR>& adapter)
258 258
        : Parent(*adapter._graph) {}
259 259
      NodeMap(const GraphAdaptorBase<GR>& adapter, const V& value)
260 260
        : Parent(*adapter._graph, value) {}
261 261

	
262 262
    private:
263 263
      NodeMap& operator=(const NodeMap& cmap) {
264 264
        return operator=<NodeMap>(cmap);
265 265
      }
266 266

	
267 267
      template <typename CMap>
268 268
      NodeMap& operator=(const CMap& cmap) {
269 269
        Parent::operator=(cmap);
270 270
        return *this;
271 271
      }
272 272

	
273 273
    };
274 274

	
275 275
    template <typename V>
276 276
    class ArcMap : public GR::template ArcMap<V> {
277 277
      typedef typename GR::template ArcMap<V> Parent;
278 278

	
279 279
    public:
280 280
      explicit ArcMap(const GraphAdaptorBase<GR>& adapter)
281 281
        : Parent(*adapter._graph) {}
282 282
      ArcMap(const GraphAdaptorBase<GR>& adapter, const V& value)
283 283
        : Parent(*adapter._graph, value) {}
284 284

	
285 285
    private:
286 286
      ArcMap& operator=(const ArcMap& cmap) {
287 287
        return operator=<ArcMap>(cmap);
288 288
      }
289 289

	
290 290
      template <typename CMap>
291 291
      ArcMap& operator=(const CMap& cmap) {
292 292
        Parent::operator=(cmap);
293 293
        return *this;
294 294
      }
295 295
    };
296 296

	
297 297
    template <typename V>
298 298
    class EdgeMap : public GR::template EdgeMap<V> {
299 299
      typedef typename GR::template EdgeMap<V> Parent;
300 300

	
301 301
    public:
302 302
      explicit EdgeMap(const GraphAdaptorBase<GR>& adapter)
303 303
        : Parent(*adapter._graph) {}
304 304
      EdgeMap(const GraphAdaptorBase<GR>& adapter, const V& value)
305 305
        : Parent(*adapter._graph, value) {}
306 306

	
307 307
    private:
308 308
      EdgeMap& operator=(const EdgeMap& cmap) {
309 309
        return operator=<EdgeMap>(cmap);
310 310
      }
311 311

	
312 312
      template <typename CMap>
313 313
      EdgeMap& operator=(const CMap& cmap) {
314 314
        Parent::operator=(cmap);
315 315
        return *this;
316 316
      }
317 317
    };
318 318

	
319 319
  };
320 320

	
321 321
  template <typename DGR>
322 322
  class ReverseDigraphBase : public DigraphAdaptorBase<DGR> {
323 323
    typedef DigraphAdaptorBase<DGR> Parent;
324 324
  public:
325 325
    typedef DGR Digraph;
326 326
  protected:
327 327
    ReverseDigraphBase() : Parent() { }
328 328
  public:
329 329
    typedef typename Parent::Node Node;
330 330
    typedef typename Parent::Arc Arc;
331 331

	
332 332
    void firstIn(Arc& a, const Node& n) const { Parent::firstOut(a, n); }
333 333
    void firstOut(Arc& a, const Node& n ) const { Parent::firstIn(a, n); }
334 334

	
335 335
    void nextIn(Arc& a) const { Parent::nextOut(a); }
336 336
    void nextOut(Arc& a) const { Parent::nextIn(a); }
337 337

	
338 338
    Node source(const Arc& a) const { return Parent::target(a); }
339 339
    Node target(const Arc& a) const { return Parent::source(a); }
340 340

	
341 341
    Arc addArc(const Node& u, const Node& v) { return Parent::addArc(v, u); }
342 342

	
343 343
    typedef FindArcTagIndicator<DGR> FindArcTag;
344 344
    Arc findArc(const Node& u, const Node& v,
345 345
                const Arc& prev = INVALID) const {
346 346
      return Parent::findArc(v, u, prev);
347 347
    }
348 348

	
349 349
  };
350 350

	
351 351
  /// \ingroup graph_adaptors
352 352
  ///
353 353
  /// \brief Adaptor class for reversing the orientation of the arcs in
354 354
  /// a digraph.
355 355
  ///
356 356
  /// ReverseDigraph can be used for reversing the arcs in a digraph.
357 357
  /// It conforms to the \ref concepts::Digraph "Digraph" concept.
358 358
  ///
359 359
  /// The adapted digraph can also be modified through this adaptor
360 360
  /// by adding or removing nodes or arcs, unless the \c GR template
361 361
  /// parameter is set to be \c const.
362 362
  ///
363
  /// This class provides item counting in the same time as the adapted
364
  /// digraph structure.
365
  ///
363 366
  /// \tparam DGR The type of the adapted digraph.
364 367
  /// It must conform to the \ref concepts::Digraph "Digraph" concept.
365 368
  /// It can also be specified to be \c const.
366 369
  ///
367 370
  /// \note The \c Node and \c Arc types of this adaptor and the adapted
368 371
  /// digraph are convertible to each other.
369 372
  template<typename DGR>
370 373
#ifdef DOXYGEN
371 374
  class ReverseDigraph {
372 375
#else
373 376
  class ReverseDigraph :
374 377
    public DigraphAdaptorExtender<ReverseDigraphBase<DGR> > {
375 378
#endif
376 379
    typedef DigraphAdaptorExtender<ReverseDigraphBase<DGR> > Parent;
377 380
  public:
378 381
    /// The type of the adapted digraph.
379 382
    typedef DGR Digraph;
380 383
  protected:
381 384
    ReverseDigraph() { }
382 385
  public:
383 386

	
384 387
    /// \brief Constructor
385 388
    ///
386 389
    /// Creates a reverse digraph adaptor for the given digraph.
387 390
    explicit ReverseDigraph(DGR& digraph) {
388 391
      Parent::initialize(digraph);
389 392
    }
390 393
  };
391 394

	
392 395
  /// \brief Returns a read-only ReverseDigraph adaptor
393 396
  ///
394 397
  /// This function just returns a read-only \ref ReverseDigraph adaptor.
395 398
  /// \ingroup graph_adaptors
396 399
  /// \relates ReverseDigraph
397 400
  template<typename DGR>
398 401
  ReverseDigraph<const DGR> reverseDigraph(const DGR& digraph) {
399 402
    return ReverseDigraph<const DGR>(digraph);
400 403
  }
401 404

	
402 405

	
403 406
  template <typename DGR, typename NF, typename AF, bool ch = true>
404 407
  class SubDigraphBase : public DigraphAdaptorBase<DGR> {
405 408
    typedef DigraphAdaptorBase<DGR> Parent;
406 409
  public:
407 410
    typedef DGR Digraph;
408 411
    typedef NF NodeFilterMap;
409 412
    typedef AF ArcFilterMap;
410 413

	
411 414
    typedef SubDigraphBase Adaptor;
412 415
  protected:
413 416
    NF* _node_filter;
414 417
    AF* _arc_filter;
415 418
    SubDigraphBase()
416 419
      : Parent(), _node_filter(0), _arc_filter(0) { }
417 420

	
418 421
    void initialize(DGR& digraph, NF& node_filter, AF& arc_filter) {
419 422
      Parent::initialize(digraph);
420 423
      _node_filter = &node_filter;
421 424
      _arc_filter = &arc_filter;      
422 425
    }
423 426

	
424 427
  public:
425 428

	
426 429
    typedef typename Parent::Node Node;
427 430
    typedef typename Parent::Arc Arc;
428 431

	
429 432
    void first(Node& i) const {
430 433
      Parent::first(i);
431 434
      while (i != INVALID && !(*_node_filter)[i]) Parent::next(i);
432 435
    }
433 436

	
434 437
    void first(Arc& i) const {
435 438
      Parent::first(i);
436 439
      while (i != INVALID && (!(*_arc_filter)[i]
437 440
                              || !(*_node_filter)[Parent::source(i)]
438 441
                              || !(*_node_filter)[Parent::target(i)]))
439 442
        Parent::next(i);
440 443
    }
441 444

	
442 445
    void firstIn(Arc& i, const Node& n) const {
443 446
      Parent::firstIn(i, n);
444 447
      while (i != INVALID && (!(*_arc_filter)[i]
445 448
                              || !(*_node_filter)[Parent::source(i)]))
446 449
        Parent::nextIn(i);
447 450
    }
448 451

	
449 452
    void firstOut(Arc& i, const Node& n) const {
450 453
      Parent::firstOut(i, n);
451 454
      while (i != INVALID && (!(*_arc_filter)[i]
452 455
                              || !(*_node_filter)[Parent::target(i)]))
453 456
        Parent::nextOut(i);
454 457
    }
455 458

	
456 459
    void next(Node& i) const {
457 460
      Parent::next(i);
458 461
      while (i != INVALID && !(*_node_filter)[i]) Parent::next(i);
459 462
    }
460 463

	
461 464
    void next(Arc& i) const {
462 465
      Parent::next(i);
463 466
      while (i != INVALID && (!(*_arc_filter)[i]
464 467
                              || !(*_node_filter)[Parent::source(i)]
465 468
                              || !(*_node_filter)[Parent::target(i)]))
466 469
        Parent::next(i);
467 470
    }
468 471

	
469 472
    void nextIn(Arc& i) const {
470 473
      Parent::nextIn(i);
471 474
      while (i != INVALID && (!(*_arc_filter)[i]
472 475
                              || !(*_node_filter)[Parent::source(i)]))
473 476
        Parent::nextIn(i);
474 477
    }
475 478

	
476 479
    void nextOut(Arc& i) const {
477 480
      Parent::nextOut(i);
478 481
      while (i != INVALID && (!(*_arc_filter)[i]
479 482
                              || !(*_node_filter)[Parent::target(i)]))
480 483
        Parent::nextOut(i);
481 484
    }
482 485

	
483 486
    void status(const Node& n, bool v) const { _node_filter->set(n, v); }
484 487
    void status(const Arc& a, bool v) const { _arc_filter->set(a, v); }
485 488

	
486 489
    bool status(const Node& n) const { return (*_node_filter)[n]; }
487 490
    bool status(const Arc& a) const { return (*_arc_filter)[a]; }
488 491

	
489 492
    typedef False NodeNumTag;
490 493
    typedef False ArcNumTag;
491 494

	
492 495
    typedef FindArcTagIndicator<DGR> FindArcTag;
493 496
    Arc findArc(const Node& source, const Node& target,
494 497
                const Arc& prev = INVALID) const {
495 498
      if (!(*_node_filter)[source] || !(*_node_filter)[target]) {
496 499
        return INVALID;
497 500
      }
498 501
      Arc arc = Parent::findArc(source, target, prev);
499 502
      while (arc != INVALID && !(*_arc_filter)[arc]) {
500 503
        arc = Parent::findArc(source, target, arc);
501 504
      }
502 505
      return arc;
503 506
    }
504 507

	
505 508
  public:
506 509

	
507 510
    template <typename V>
508 511
    class NodeMap 
509 512
      : public SubMapExtender<SubDigraphBase<DGR, NF, AF, ch>, 
510 513
	      LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, NodeMap<V>)> {
511 514
      typedef SubMapExtender<SubDigraphBase<DGR, NF, AF, ch>,
512 515
	LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, NodeMap<V>)> Parent;
513 516

	
514 517
    public:
515 518
      typedef V Value;
516 519

	
517 520
      NodeMap(const SubDigraphBase<DGR, NF, AF, ch>& adaptor)
518 521
        : Parent(adaptor) {}
519 522
      NodeMap(const SubDigraphBase<DGR, NF, AF, ch>& adaptor, const V& value)
520 523
        : Parent(adaptor, value) {}
521 524

	
522 525
    private:
523 526
      NodeMap& operator=(const NodeMap& cmap) {
524 527
        return operator=<NodeMap>(cmap);
525 528
      }
526 529

	
527 530
      template <typename CMap>
528 531
      NodeMap& operator=(const CMap& cmap) {
529 532
        Parent::operator=(cmap);
530 533
        return *this;
531 534
      }
532 535
    };
533 536

	
534 537
    template <typename V>
535 538
    class ArcMap 
536 539
      : public SubMapExtender<SubDigraphBase<DGR, NF, AF, ch>,
537 540
	      LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, ArcMap<V>)> {
538 541
      typedef SubMapExtender<SubDigraphBase<DGR, NF, AF, ch>,
539 542
        LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, ArcMap<V>)> Parent;
540 543

	
541 544
    public:
542 545
      typedef V Value;
543 546

	
544 547
      ArcMap(const SubDigraphBase<DGR, NF, AF, ch>& adaptor)
545 548
        : Parent(adaptor) {}
546 549
      ArcMap(const SubDigraphBase<DGR, NF, AF, ch>& adaptor, const V& value)
547 550
        : Parent(adaptor, value) {}
548 551

	
549 552
    private:
550 553
      ArcMap& operator=(const ArcMap& cmap) {
551 554
        return operator=<ArcMap>(cmap);
552 555
      }
553 556

	
554 557
      template <typename CMap>
555 558
      ArcMap& operator=(const CMap& cmap) {
556 559
        Parent::operator=(cmap);
557 560
        return *this;
558 561
      }
559 562
    };
560 563

	
561 564
  };
562 565

	
563 566
  template <typename DGR, typename NF, typename AF>
564 567
  class SubDigraphBase<DGR, NF, AF, false>
565 568
    : public DigraphAdaptorBase<DGR> {
566 569
    typedef DigraphAdaptorBase<DGR> Parent;
567 570
  public:
568 571
    typedef DGR Digraph;
569 572
    typedef NF NodeFilterMap;
570 573
    typedef AF ArcFilterMap;
571 574

	
572 575
    typedef SubDigraphBase Adaptor;
573 576
  protected:
574 577
    NF* _node_filter;
575 578
    AF* _arc_filter;
576 579
    SubDigraphBase()
577 580
      : Parent(), _node_filter(0), _arc_filter(0) { }
578 581

	
579 582
    void initialize(DGR& digraph, NF& node_filter, AF& arc_filter) {
580 583
      Parent::initialize(digraph);
581 584
      _node_filter = &node_filter;
582 585
      _arc_filter = &arc_filter;      
583 586
    }
584 587

	
585 588
  public:
586 589

	
587 590
    typedef typename Parent::Node Node;
588 591
    typedef typename Parent::Arc Arc;
589 592

	
590 593
    void first(Node& i) const {
591 594
      Parent::first(i);
592 595
      while (i!=INVALID && !(*_node_filter)[i]) Parent::next(i);
593 596
    }
594 597

	
595 598
    void first(Arc& i) const {
596 599
      Parent::first(i);
597 600
      while (i!=INVALID && !(*_arc_filter)[i]) Parent::next(i);
598 601
    }
599 602

	
600 603
    void firstIn(Arc& i, const Node& n) const {
601 604
      Parent::firstIn(i, n);
602 605
      while (i!=INVALID && !(*_arc_filter)[i]) Parent::nextIn(i);
603 606
    }
604 607

	
605 608
    void firstOut(Arc& i, const Node& n) const {
606 609
      Parent::firstOut(i, n);
607 610
      while (i!=INVALID && !(*_arc_filter)[i]) Parent::nextOut(i);
608 611
    }
609 612

	
610 613
    void next(Node& i) const {
611 614
      Parent::next(i);
612 615
      while (i!=INVALID && !(*_node_filter)[i]) Parent::next(i);
613 616
    }
614 617
    void next(Arc& i) const {
615 618
      Parent::next(i);
616 619
      while (i!=INVALID && !(*_arc_filter)[i]) Parent::next(i);
617 620
    }
618 621
    void nextIn(Arc& i) const {
619 622
      Parent::nextIn(i);
620 623
      while (i!=INVALID && !(*_arc_filter)[i]) Parent::nextIn(i);
621 624
    }
622 625

	
623 626
    void nextOut(Arc& i) const {
624 627
      Parent::nextOut(i);
625 628
      while (i!=INVALID && !(*_arc_filter)[i]) Parent::nextOut(i);
626 629
    }
627 630

	
628 631
    void status(const Node& n, bool v) const { _node_filter->set(n, v); }
629 632
    void status(const Arc& a, bool v) const { _arc_filter->set(a, v); }
630 633

	
631 634
    bool status(const Node& n) const { return (*_node_filter)[n]; }
632 635
    bool status(const Arc& a) const { return (*_arc_filter)[a]; }
633 636

	
634 637
    typedef False NodeNumTag;
635 638
    typedef False ArcNumTag;
636 639

	
637 640
    typedef FindArcTagIndicator<DGR> FindArcTag;
638 641
    Arc findArc(const Node& source, const Node& target,
639 642
                const Arc& prev = INVALID) const {
640 643
      if (!(*_node_filter)[source] || !(*_node_filter)[target]) {
641 644
        return INVALID;
642 645
      }
643 646
      Arc arc = Parent::findArc(source, target, prev);
644 647
      while (arc != INVALID && !(*_arc_filter)[arc]) {
645 648
        arc = Parent::findArc(source, target, arc);
646 649
      }
647 650
      return arc;
648 651
    }
649 652

	
650 653
    template <typename V>
651 654
    class NodeMap 
652 655
      : public SubMapExtender<SubDigraphBase<DGR, NF, AF, false>,
653 656
          LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, NodeMap<V>)> {
654 657
      typedef SubMapExtender<SubDigraphBase<DGR, NF, AF, false>, 
655 658
        LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, NodeMap<V>)> Parent;
656 659

	
657 660
    public:
658 661
      typedef V Value;
659 662

	
660 663
      NodeMap(const SubDigraphBase<DGR, NF, AF, false>& adaptor)
661 664
        : Parent(adaptor) {}
662 665
      NodeMap(const SubDigraphBase<DGR, NF, AF, false>& adaptor, const V& value)
663 666
        : Parent(adaptor, value) {}
664 667

	
665 668
    private:
666 669
      NodeMap& operator=(const NodeMap& cmap) {
667 670
        return operator=<NodeMap>(cmap);
668 671
      }
669 672

	
670 673
      template <typename CMap>
671 674
      NodeMap& operator=(const CMap& cmap) {
672 675
        Parent::operator=(cmap);
673 676
        return *this;
674 677
      }
675 678
    };
676 679

	
677 680
    template <typename V>
678 681
    class ArcMap 
679 682
      : public SubMapExtender<SubDigraphBase<DGR, NF, AF, false>,
680 683
          LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, ArcMap<V>)> {
681 684
      typedef SubMapExtender<SubDigraphBase<DGR, NF, AF, false>,
682 685
        LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, ArcMap<V>)> Parent;
683 686

	
684 687
    public:
685 688
      typedef V Value;
686 689

	
687 690
      ArcMap(const SubDigraphBase<DGR, NF, AF, false>& adaptor)
688 691
        : Parent(adaptor) {}
689 692
      ArcMap(const SubDigraphBase<DGR, NF, AF, false>& adaptor, const V& value)
690 693
        : Parent(adaptor, value) {}
691 694

	
692 695
    private:
693 696
      ArcMap& operator=(const ArcMap& cmap) {
694 697
        return operator=<ArcMap>(cmap);
695 698
      }
696 699

	
697 700
      template <typename CMap>
698 701
      ArcMap& operator=(const CMap& cmap) {
699 702
        Parent::operator=(cmap);
700 703
        return *this;
701 704
      }
702 705
    };
703 706

	
704 707
  };
705 708

	
706 709
  /// \ingroup graph_adaptors
707 710
  ///
708 711
  /// \brief Adaptor class for hiding nodes and arcs in a digraph
709 712
  ///
710 713
  /// SubDigraph can be used for hiding nodes and arcs in a digraph.
711 714
  /// A \c bool node map and a \c bool arc map must be specified, which
712 715
  /// define the filters for nodes and arcs.
713 716
  /// Only the nodes and arcs with \c true filter value are
714 717
  /// shown in the subdigraph. The arcs that are incident to hidden
715 718
  /// nodes are also filtered out.
716 719
  /// This adaptor conforms to the \ref concepts::Digraph "Digraph" concept.
717 720
  ///
718 721
  /// The adapted digraph can also be modified through this adaptor
719 722
  /// by adding or removing nodes or arcs, unless the \c GR template
720 723
  /// parameter is set to be \c const.
721 724
  ///
725
  /// This class provides only linear time counting for nodes and arcs.
726
  ///
722 727
  /// \tparam DGR The type of the adapted digraph.
723 728
  /// It must conform to the \ref concepts::Digraph "Digraph" concept.
724 729
  /// It can also be specified to be \c const.
725 730
  /// \tparam NF The type of the node filter map.
726 731
  /// It must be a \c bool (or convertible) node map of the
727 732
  /// adapted digraph. The default type is
728 733
  /// \ref concepts::Digraph::NodeMap "DGR::NodeMap<bool>".
729 734
  /// \tparam AF The type of the arc filter map.
730 735
  /// It must be \c bool (or convertible) arc map of the
731 736
  /// adapted digraph. The default type is
732 737
  /// \ref concepts::Digraph::ArcMap "DGR::ArcMap<bool>".
733 738
  ///
734 739
  /// \note The \c Node and \c Arc types of this adaptor and the adapted
735 740
  /// digraph are convertible to each other.
736 741
  ///
737 742
  /// \see FilterNodes
738 743
  /// \see FilterArcs
739 744
#ifdef DOXYGEN
740 745
  template<typename DGR, typename NF, typename AF>
741 746
  class SubDigraph {
742 747
#else
743 748
  template<typename DGR,
744 749
           typename NF = typename DGR::template NodeMap<bool>,
745 750
           typename AF = typename DGR::template ArcMap<bool> >
746 751
  class SubDigraph :
747 752
    public DigraphAdaptorExtender<SubDigraphBase<DGR, NF, AF, true> > {
748 753
#endif
749 754
  public:
750 755
    /// The type of the adapted digraph.
751 756
    typedef DGR Digraph;
752 757
    /// The type of the node filter map.
753 758
    typedef NF NodeFilterMap;
754 759
    /// The type of the arc filter map.
755 760
    typedef AF ArcFilterMap;
756 761

	
757 762
    typedef DigraphAdaptorExtender<SubDigraphBase<DGR, NF, AF, true> >
758 763
      Parent;
759 764

	
760 765
    typedef typename Parent::Node Node;
761 766
    typedef typename Parent::Arc Arc;
762 767

	
763 768
  protected:
764 769
    SubDigraph() { }
765 770
  public:
766 771

	
767 772
    /// \brief Constructor
768 773
    ///
769 774
    /// Creates a subdigraph for the given digraph with the
770 775
    /// given node and arc filter maps.
771 776
    SubDigraph(DGR& digraph, NF& node_filter, AF& arc_filter) {
772 777
      Parent::initialize(digraph, node_filter, arc_filter);
773 778
    }
774 779

	
775 780
    /// \brief Sets the status of the given node
776 781
    ///
777 782
    /// This function sets the status of the given node.
778 783
    /// It is done by simply setting the assigned value of \c n
779 784
    /// to \c v in the node filter map.
780 785
    void status(const Node& n, bool v) const { Parent::status(n, v); }
781 786

	
782 787
    /// \brief Sets the status of the given arc
783 788
    ///
784 789
    /// This function sets the status of the given arc.
785 790
    /// It is done by simply setting the assigned value of \c a
786 791
    /// to \c v in the arc filter map.
787 792
    void status(const Arc& a, bool v) const { Parent::status(a, v); }
788 793

	
789 794
    /// \brief Returns the status of the given node
790 795
    ///
791 796
    /// This function returns the status of the given node.
792 797
    /// It is \c true if the given node is enabled (i.e. not hidden).
793 798
    bool status(const Node& n) const { return Parent::status(n); }
794 799

	
795 800
    /// \brief Returns the status of the given arc
796 801
    ///
797 802
    /// This function returns the status of the given arc.
798 803
    /// It is \c true if the given arc is enabled (i.e. not hidden).
799 804
    bool status(const Arc& a) const { return Parent::status(a); }
800 805

	
801 806
    /// \brief Disables the given node
802 807
    ///
803 808
    /// This function disables the given node in the subdigraph,
804 809
    /// so the iteration jumps over it.
805 810
    /// It is the same as \ref status() "status(n, false)".
806 811
    void disable(const Node& n) const { Parent::status(n, false); }
807 812

	
808 813
    /// \brief Disables the given arc
809 814
    ///
810 815
    /// This function disables the given arc in the subdigraph,
811 816
    /// so the iteration jumps over it.
812 817
    /// It is the same as \ref status() "status(a, false)".
813 818
    void disable(const Arc& a) const { Parent::status(a, false); }
814 819

	
815 820
    /// \brief Enables the given node
816 821
    ///
817 822
    /// This function enables the given node in the subdigraph.
818 823
    /// It is the same as \ref status() "status(n, true)".
819 824
    void enable(const Node& n) const { Parent::status(n, true); }
820 825

	
821 826
    /// \brief Enables the given arc
822 827
    ///
823 828
    /// This function enables the given arc in the subdigraph.
824 829
    /// It is the same as \ref status() "status(a, true)".
825 830
    void enable(const Arc& a) const { Parent::status(a, true); }
826 831

	
827 832
  };
828 833

	
829 834
  /// \brief Returns a read-only SubDigraph adaptor
830 835
  ///
831 836
  /// This function just returns a read-only \ref SubDigraph adaptor.
832 837
  /// \ingroup graph_adaptors
833 838
  /// \relates SubDigraph
834 839
  template<typename DGR, typename NF, typename AF>
835 840
  SubDigraph<const DGR, NF, AF>
836 841
  subDigraph(const DGR& digraph,
837 842
             NF& node_filter, AF& arc_filter) {
838 843
    return SubDigraph<const DGR, NF, AF>
839 844
      (digraph, node_filter, arc_filter);
840 845
  }
841 846

	
842 847
  template<typename DGR, typename NF, typename AF>
843 848
  SubDigraph<const DGR, const NF, AF>
844 849
  subDigraph(const DGR& digraph,
845 850
             const NF& node_filter, AF& arc_filter) {
846 851
    return SubDigraph<const DGR, const NF, AF>
847 852
      (digraph, node_filter, arc_filter);
848 853
  }
849 854

	
850 855
  template<typename DGR, typename NF, typename AF>
851 856
  SubDigraph<const DGR, NF, const AF>
852 857
  subDigraph(const DGR& digraph,
853 858
             NF& node_filter, const AF& arc_filter) {
854 859
    return SubDigraph<const DGR, NF, const AF>
855 860
      (digraph, node_filter, arc_filter);
856 861
  }
857 862

	
858 863
  template<typename DGR, typename NF, typename AF>
859 864
  SubDigraph<const DGR, const NF, const AF>
860 865
  subDigraph(const DGR& digraph,
861 866
             const NF& node_filter, const AF& arc_filter) {
862 867
    return SubDigraph<const DGR, const NF, const AF>
863 868
      (digraph, node_filter, arc_filter);
864 869
  }
865 870

	
866 871

	
867 872
  template <typename GR, typename NF, typename EF, bool ch = true>
868 873
  class SubGraphBase : public GraphAdaptorBase<GR> {
869 874
    typedef GraphAdaptorBase<GR> Parent;
870 875
  public:
871 876
    typedef GR Graph;
872 877
    typedef NF NodeFilterMap;
873 878
    typedef EF EdgeFilterMap;
874 879

	
875 880
    typedef SubGraphBase Adaptor;
876 881
  protected:
877 882

	
878 883
    NF* _node_filter;
879 884
    EF* _edge_filter;
880 885

	
881 886
    SubGraphBase()
882 887
      : Parent(), _node_filter(0), _edge_filter(0) { }
883 888

	
884 889
    void initialize(GR& graph, NF& node_filter, EF& edge_filter) {
885 890
      Parent::initialize(graph);
886 891
      _node_filter = &node_filter;
887 892
      _edge_filter = &edge_filter;
888 893
    }
889 894

	
890 895
  public:
891 896

	
892 897
    typedef typename Parent::Node Node;
893 898
    typedef typename Parent::Arc Arc;
894 899
    typedef typename Parent::Edge Edge;
895 900

	
896 901
    void first(Node& i) const {
897 902
      Parent::first(i);
898 903
      while (i!=INVALID && !(*_node_filter)[i]) Parent::next(i);
899 904
    }
900 905

	
901 906
    void first(Arc& i) const {
902 907
      Parent::first(i);
903 908
      while (i!=INVALID && (!(*_edge_filter)[i]
904 909
                            || !(*_node_filter)[Parent::source(i)]
905 910
                            || !(*_node_filter)[Parent::target(i)]))
906 911
        Parent::next(i);
907 912
    }
908 913

	
909 914
    void first(Edge& i) const {
910 915
      Parent::first(i);
911 916
      while (i!=INVALID && (!(*_edge_filter)[i]
912 917
                            || !(*_node_filter)[Parent::u(i)]
913 918
                            || !(*_node_filter)[Parent::v(i)]))
914 919
        Parent::next(i);
915 920
    }
916 921

	
917 922
    void firstIn(Arc& i, const Node& n) const {
918 923
      Parent::firstIn(i, n);
919 924
      while (i!=INVALID && (!(*_edge_filter)[i]
920 925
                            || !(*_node_filter)[Parent::source(i)]))
921 926
        Parent::nextIn(i);
922 927
    }
923 928

	
924 929
    void firstOut(Arc& i, const Node& n) const {
925 930
      Parent::firstOut(i, n);
926 931
      while (i!=INVALID && (!(*_edge_filter)[i]
927 932
                            || !(*_node_filter)[Parent::target(i)]))
928 933
        Parent::nextOut(i);
929 934
    }
930 935

	
931 936
    void firstInc(Edge& i, bool& d, const Node& n) const {
932 937
      Parent::firstInc(i, d, n);
933 938
      while (i!=INVALID && (!(*_edge_filter)[i]
934 939
                            || !(*_node_filter)[Parent::u(i)]
935 940
                            || !(*_node_filter)[Parent::v(i)]))
936 941
        Parent::nextInc(i, d);
937 942
    }
938 943

	
939 944
    void next(Node& i) const {
940 945
      Parent::next(i);
941 946
      while (i!=INVALID && !(*_node_filter)[i]) Parent::next(i);
942 947
    }
943 948

	
944 949
    void next(Arc& i) const {
945 950
      Parent::next(i);
946 951
      while (i!=INVALID && (!(*_edge_filter)[i]
947 952
                            || !(*_node_filter)[Parent::source(i)]
948 953
                            || !(*_node_filter)[Parent::target(i)]))
949 954
        Parent::next(i);
950 955
    }
951 956

	
952 957
    void next(Edge& i) const {
953 958
      Parent::next(i);
954 959
      while (i!=INVALID && (!(*_edge_filter)[i]
955 960
                            || !(*_node_filter)[Parent::u(i)]
956 961
                            || !(*_node_filter)[Parent::v(i)]))
957 962
        Parent::next(i);
958 963
    }
959 964

	
960 965
    void nextIn(Arc& i) const {
961 966
      Parent::nextIn(i);
962 967
      while (i!=INVALID && (!(*_edge_filter)[i]
963 968
                            || !(*_node_filter)[Parent::source(i)]))
964 969
        Parent::nextIn(i);
965 970
    }
966 971

	
967 972
    void nextOut(Arc& i) const {
968 973
      Parent::nextOut(i);
969 974
      while (i!=INVALID && (!(*_edge_filter)[i]
970 975
                            || !(*_node_filter)[Parent::target(i)]))
971 976
        Parent::nextOut(i);
972 977
    }
973 978

	
974 979
    void nextInc(Edge& i, bool& d) const {
975 980
      Parent::nextInc(i, d);
976 981
      while (i!=INVALID && (!(*_edge_filter)[i]
977 982
                            || !(*_node_filter)[Parent::u(i)]
978 983
                            || !(*_node_filter)[Parent::v(i)]))
979 984
        Parent::nextInc(i, d);
980 985
    }
981 986

	
982 987
    void status(const Node& n, bool v) const { _node_filter->set(n, v); }
983 988
    void status(const Edge& e, bool v) const { _edge_filter->set(e, v); }
984 989

	
985 990
    bool status(const Node& n) const { return (*_node_filter)[n]; }
986 991
    bool status(const Edge& e) const { return (*_edge_filter)[e]; }
987 992

	
988 993
    typedef False NodeNumTag;
989 994
    typedef False ArcNumTag;
990 995
    typedef False EdgeNumTag;
991 996

	
992 997
    typedef FindArcTagIndicator<Graph> FindArcTag;
993 998
    Arc findArc(const Node& u, const Node& v,
994 999
                const Arc& prev = INVALID) const {
995 1000
      if (!(*_node_filter)[u] || !(*_node_filter)[v]) {
996 1001
        return INVALID;
997 1002
      }
998 1003
      Arc arc = Parent::findArc(u, v, prev);
999 1004
      while (arc != INVALID && !(*_edge_filter)[arc]) {
1000 1005
        arc = Parent::findArc(u, v, arc);
1001 1006
      }
1002 1007
      return arc;
1003 1008
    }
1004 1009

	
1005 1010
    typedef FindEdgeTagIndicator<Graph> FindEdgeTag;
1006 1011
    Edge findEdge(const Node& u, const Node& v,
1007 1012
                  const Edge& prev = INVALID) const {
1008 1013
      if (!(*_node_filter)[u] || !(*_node_filter)[v]) {
1009 1014
        return INVALID;
1010 1015
      }
1011 1016
      Edge edge = Parent::findEdge(u, v, prev);
1012 1017
      while (edge != INVALID && !(*_edge_filter)[edge]) {
1013 1018
        edge = Parent::findEdge(u, v, edge);
1014 1019
      }
1015 1020
      return edge;
1016 1021
    }
1017 1022

	
1018 1023
    template <typename V>
1019 1024
    class NodeMap 
1020 1025
      : public SubMapExtender<SubGraphBase<GR, NF, EF, ch>,
1021 1026
          LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, NodeMap<V>)> {
1022 1027
      typedef SubMapExtender<SubGraphBase<GR, NF, EF, ch>, 
1023 1028
        LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, NodeMap<V>)> Parent;
1024 1029

	
1025 1030
    public:
1026 1031
      typedef V Value;
1027 1032

	
1028 1033
      NodeMap(const SubGraphBase<GR, NF, EF, ch>& adaptor)
1029 1034
        : Parent(adaptor) {}
1030 1035
      NodeMap(const SubGraphBase<GR, NF, EF, ch>& adaptor, const V& value)
1031 1036
        : Parent(adaptor, value) {}
1032 1037

	
1033 1038
    private:
1034 1039
      NodeMap& operator=(const NodeMap& cmap) {
1035 1040
        return operator=<NodeMap>(cmap);
1036 1041
      }
1037 1042

	
1038 1043
      template <typename CMap>
1039 1044
      NodeMap& operator=(const CMap& cmap) {
1040 1045
        Parent::operator=(cmap);
1041 1046
        return *this;
1042 1047
      }
1043 1048
    };
1044 1049

	
1045 1050
    template <typename V>
1046 1051
    class ArcMap 
1047 1052
      : public SubMapExtender<SubGraphBase<GR, NF, EF, ch>,
1048 1053
          LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, ArcMap<V>)> {
1049 1054
      typedef SubMapExtender<SubGraphBase<GR, NF, EF, ch>, 
1050 1055
        LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, ArcMap<V>)> Parent;
1051 1056

	
1052 1057
    public:
1053 1058
      typedef V Value;
1054 1059

	
1055 1060
      ArcMap(const SubGraphBase<GR, NF, EF, ch>& adaptor)
1056 1061
        : Parent(adaptor) {}
1057 1062
      ArcMap(const SubGraphBase<GR, NF, EF, ch>& adaptor, const V& value)
1058 1063
        : Parent(adaptor, value) {}
1059 1064

	
1060 1065
    private:
1061 1066
      ArcMap& operator=(const ArcMap& cmap) {
1062 1067
        return operator=<ArcMap>(cmap);
1063 1068
      }
1064 1069

	
1065 1070
      template <typename CMap>
1066 1071
      ArcMap& operator=(const CMap& cmap) {
1067 1072
        Parent::operator=(cmap);
1068 1073
        return *this;
1069 1074
      }
1070 1075
    };
1071 1076

	
1072 1077
    template <typename V>
1073 1078
    class EdgeMap 
1074 1079
      : public SubMapExtender<SubGraphBase<GR, NF, EF, ch>,
1075 1080
        LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, EdgeMap<V>)> {
1076 1081
      typedef SubMapExtender<SubGraphBase<GR, NF, EF, ch>, 
1077 1082
        LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, EdgeMap<V>)> Parent;
1078 1083

	
1079 1084
    public:
1080 1085
      typedef V Value;
1081 1086

	
1082 1087
      EdgeMap(const SubGraphBase<GR, NF, EF, ch>& adaptor)
1083 1088
        : Parent(adaptor) {}
1084 1089

	
1085 1090
      EdgeMap(const SubGraphBase<GR, NF, EF, ch>& adaptor, const V& value)
1086 1091
        : Parent(adaptor, value) {}
1087 1092

	
1088 1093
    private:
1089 1094
      EdgeMap& operator=(const EdgeMap& cmap) {
1090 1095
        return operator=<EdgeMap>(cmap);
1091 1096
      }
1092 1097

	
1093 1098
      template <typename CMap>
1094 1099
      EdgeMap& operator=(const CMap& cmap) {
1095 1100
        Parent::operator=(cmap);
1096 1101
        return *this;
1097 1102
      }
1098 1103
    };
1099 1104

	
1100 1105
  };
1101 1106

	
1102 1107
  template <typename GR, typename NF, typename EF>
1103 1108
  class SubGraphBase<GR, NF, EF, false>
1104 1109
    : public GraphAdaptorBase<GR> {
1105 1110
    typedef GraphAdaptorBase<GR> Parent;
1106 1111
  public:
1107 1112
    typedef GR Graph;
1108 1113
    typedef NF NodeFilterMap;
1109 1114
    typedef EF EdgeFilterMap;
1110 1115

	
1111 1116
    typedef SubGraphBase Adaptor;
1112 1117
  protected:
1113 1118
    NF* _node_filter;
1114 1119
    EF* _edge_filter;
1115 1120
    SubGraphBase() 
1116 1121
	  : Parent(), _node_filter(0), _edge_filter(0) { }
1117 1122

	
1118 1123
    void initialize(GR& graph, NF& node_filter, EF& edge_filter) {
1119 1124
      Parent::initialize(graph);
1120 1125
      _node_filter = &node_filter;
1121 1126
      _edge_filter = &edge_filter;
1122 1127
    }
1123 1128

	
1124 1129
  public:
1125 1130

	
1126 1131
    typedef typename Parent::Node Node;
1127 1132
    typedef typename Parent::Arc Arc;
1128 1133
    typedef typename Parent::Edge Edge;
1129 1134

	
1130 1135
    void first(Node& i) const {
1131 1136
      Parent::first(i);
1132 1137
      while (i!=INVALID && !(*_node_filter)[i]) Parent::next(i);
1133 1138
    }
1134 1139

	
1135 1140
    void first(Arc& i) const {
1136 1141
      Parent::first(i);
1137 1142
      while (i!=INVALID && !(*_edge_filter)[i]) Parent::next(i);
1138 1143
    }
1139 1144

	
1140 1145
    void first(Edge& i) const {
1141 1146
      Parent::first(i);
1142 1147
      while (i!=INVALID && !(*_edge_filter)[i]) Parent::next(i);
1143 1148
    }
1144 1149

	
1145 1150
    void firstIn(Arc& i, const Node& n) const {
1146 1151
      Parent::firstIn(i, n);
1147 1152
      while (i!=INVALID && !(*_edge_filter)[i]) Parent::nextIn(i);
1148 1153
    }
1149 1154

	
1150 1155
    void firstOut(Arc& i, const Node& n) const {
1151 1156
      Parent::firstOut(i, n);
1152 1157
      while (i!=INVALID && !(*_edge_filter)[i]) Parent::nextOut(i);
1153 1158
    }
1154 1159

	
1155 1160
    void firstInc(Edge& i, bool& d, const Node& n) const {
1156 1161
      Parent::firstInc(i, d, n);
1157 1162
      while (i!=INVALID && !(*_edge_filter)[i]) Parent::nextInc(i, d);
1158 1163
    }
1159 1164

	
1160 1165
    void next(Node& i) const {
1161 1166
      Parent::next(i);
1162 1167
      while (i!=INVALID && !(*_node_filter)[i]) Parent::next(i);
1163 1168
    }
1164 1169
    void next(Arc& i) const {
1165 1170
      Parent::next(i);
1166 1171
      while (i!=INVALID && !(*_edge_filter)[i]) Parent::next(i);
1167 1172
    }
1168 1173
    void next(Edge& i) const {
1169 1174
      Parent::next(i);
1170 1175
      while (i!=INVALID && !(*_edge_filter)[i]) Parent::next(i);
1171 1176
    }
1172 1177
    void nextIn(Arc& i) const {
1173 1178
      Parent::nextIn(i);
1174 1179
      while (i!=INVALID && !(*_edge_filter)[i]) Parent::nextIn(i);
1175 1180
    }
1176 1181

	
1177 1182
    void nextOut(Arc& i) const {
1178 1183
      Parent::nextOut(i);
1179 1184
      while (i!=INVALID && !(*_edge_filter)[i]) Parent::nextOut(i);
1180 1185
    }
1181 1186
    void nextInc(Edge& i, bool& d) const {
1182 1187
      Parent::nextInc(i, d);
1183 1188
      while (i!=INVALID && !(*_edge_filter)[i]) Parent::nextInc(i, d);
1184 1189
    }
1185 1190

	
1186 1191
    void status(const Node& n, bool v) const { _node_filter->set(n, v); }
1187 1192
    void status(const Edge& e, bool v) const { _edge_filter->set(e, v); }
1188 1193

	
1189 1194
    bool status(const Node& n) const { return (*_node_filter)[n]; }
1190 1195
    bool status(const Edge& e) const { return (*_edge_filter)[e]; }
1191 1196

	
1192 1197
    typedef False NodeNumTag;
1193 1198
    typedef False ArcNumTag;
1194 1199
    typedef False EdgeNumTag;
1195 1200

	
1196 1201
    typedef FindArcTagIndicator<Graph> FindArcTag;
1197 1202
    Arc findArc(const Node& u, const Node& v,
1198 1203
                const Arc& prev = INVALID) const {
1199 1204
      Arc arc = Parent::findArc(u, v, prev);
1200 1205
      while (arc != INVALID && !(*_edge_filter)[arc]) {
1201 1206
        arc = Parent::findArc(u, v, arc);
1202 1207
      }
1203 1208
      return arc;
1204 1209
    }
1205 1210

	
1206 1211
    typedef FindEdgeTagIndicator<Graph> FindEdgeTag;
1207 1212
    Edge findEdge(const Node& u, const Node& v,
1208 1213
                  const Edge& prev = INVALID) const {
1209 1214
      Edge edge = Parent::findEdge(u, v, prev);
1210 1215
      while (edge != INVALID && !(*_edge_filter)[edge]) {
1211 1216
        edge = Parent::findEdge(u, v, edge);
1212 1217
      }
1213 1218
      return edge;
1214 1219
    }
1215 1220

	
1216 1221
    template <typename V>
1217 1222
    class NodeMap 
1218 1223
      : public SubMapExtender<SubGraphBase<GR, NF, EF, false>,
1219 1224
          LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, NodeMap<V>)> {
1220 1225
      typedef SubMapExtender<SubGraphBase<GR, NF, EF, false>, 
1221 1226
        LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, NodeMap<V>)> Parent;
1222 1227

	
1223 1228
    public:
1224 1229
      typedef V Value;
1225 1230

	
1226 1231
      NodeMap(const SubGraphBase<GR, NF, EF, false>& adaptor)
1227 1232
        : Parent(adaptor) {}
1228 1233
      NodeMap(const SubGraphBase<GR, NF, EF, false>& adaptor, const V& value)
1229 1234
        : Parent(adaptor, value) {}
1230 1235

	
1231 1236
    private:
1232 1237
      NodeMap& operator=(const NodeMap& cmap) {
1233 1238
        return operator=<NodeMap>(cmap);
1234 1239
      }
1235 1240

	
1236 1241
      template <typename CMap>
1237 1242
      NodeMap& operator=(const CMap& cmap) {
1238 1243
        Parent::operator=(cmap);
1239 1244
        return *this;
1240 1245
      }
1241 1246
    };
1242 1247

	
1243 1248
    template <typename V>
1244 1249
    class ArcMap 
1245 1250
      : public SubMapExtender<SubGraphBase<GR, NF, EF, false>,
1246 1251
          LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, ArcMap<V>)> {
1247 1252
      typedef SubMapExtender<SubGraphBase<GR, NF, EF, false>, 
1248 1253
        LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, ArcMap<V>)> Parent;
1249 1254

	
1250 1255
    public:
1251 1256
      typedef V Value;
1252 1257

	
1253 1258
      ArcMap(const SubGraphBase<GR, NF, EF, false>& adaptor)
1254 1259
        : Parent(adaptor) {}
1255 1260
      ArcMap(const SubGraphBase<GR, NF, EF, false>& adaptor, const V& value)
1256 1261
        : Parent(adaptor, value) {}
1257 1262

	
1258 1263
    private:
1259 1264
      ArcMap& operator=(const ArcMap& cmap) {
1260 1265
        return operator=<ArcMap>(cmap);
1261 1266
      }
1262 1267

	
1263 1268
      template <typename CMap>
1264 1269
      ArcMap& operator=(const CMap& cmap) {
1265 1270
        Parent::operator=(cmap);
1266 1271
        return *this;
1267 1272
      }
1268 1273
    };
1269 1274

	
1270 1275
    template <typename V>
1271 1276
    class EdgeMap 
1272 1277
      : public SubMapExtender<SubGraphBase<GR, NF, EF, false>,
1273 1278
        LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, EdgeMap<V>)> {
1274 1279
      typedef SubMapExtender<SubGraphBase<GR, NF, EF, false>, 
1275 1280
	LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, EdgeMap<V>)> Parent;
1276 1281

	
1277 1282
    public:
1278 1283
      typedef V Value;
1279 1284

	
1280 1285
      EdgeMap(const SubGraphBase<GR, NF, EF, false>& adaptor)
1281 1286
        : Parent(adaptor) {}
1282 1287

	
1283 1288
      EdgeMap(const SubGraphBase<GR, NF, EF, false>& adaptor, const V& value)
1284 1289
        : Parent(adaptor, value) {}
1285 1290

	
1286 1291
    private:
1287 1292
      EdgeMap& operator=(const EdgeMap& cmap) {
1288 1293
        return operator=<EdgeMap>(cmap);
1289 1294
      }
1290 1295

	
1291 1296
      template <typename CMap>
1292 1297
      EdgeMap& operator=(const CMap& cmap) {
1293 1298
        Parent::operator=(cmap);
1294 1299
        return *this;
1295 1300
      }
1296 1301
    };
1297 1302

	
1298 1303
  };
1299 1304

	
1300 1305
  /// \ingroup graph_adaptors
1301 1306
  ///
1302 1307
  /// \brief Adaptor class for hiding nodes and edges in an undirected
1303 1308
  /// graph.
1304 1309
  ///
1305 1310
  /// SubGraph can be used for hiding nodes and edges in a graph.
1306 1311
  /// A \c bool node map and a \c bool edge map must be specified, which
1307 1312
  /// define the filters for nodes and edges.
1308 1313
  /// Only the nodes and edges with \c true filter value are
1309 1314
  /// shown in the subgraph. The edges that are incident to hidden
1310 1315
  /// nodes are also filtered out.
1311 1316
  /// This adaptor conforms to the \ref concepts::Graph "Graph" concept.
1312 1317
  ///
1313 1318
  /// The adapted graph can also be modified through this adaptor
1314 1319
  /// by adding or removing nodes or edges, unless the \c GR template
1315 1320
  /// parameter is set to be \c const.
1316 1321
  ///
1322
  /// This class provides only linear time counting for nodes, edges and arcs.
1323
  ///
1317 1324
  /// \tparam GR The type of the adapted graph.
1318 1325
  /// It must conform to the \ref concepts::Graph "Graph" concept.
1319 1326
  /// It can also be specified to be \c const.
1320 1327
  /// \tparam NF The type of the node filter map.
1321 1328
  /// It must be a \c bool (or convertible) node map of the
1322 1329
  /// adapted graph. The default type is
1323 1330
  /// \ref concepts::Graph::NodeMap "GR::NodeMap<bool>".
1324 1331
  /// \tparam EF The type of the edge filter map.
1325 1332
  /// It must be a \c bool (or convertible) edge map of the
1326 1333
  /// adapted graph. The default type is
1327 1334
  /// \ref concepts::Graph::EdgeMap "GR::EdgeMap<bool>".
1328 1335
  ///
1329 1336
  /// \note The \c Node, \c Edge and \c Arc types of this adaptor and the
1330 1337
  /// adapted graph are convertible to each other.
1331 1338
  ///
1332 1339
  /// \see FilterNodes
1333 1340
  /// \see FilterEdges
1334 1341
#ifdef DOXYGEN
1335 1342
  template<typename GR, typename NF, typename EF>
1336 1343
  class SubGraph {
1337 1344
#else
1338 1345
  template<typename GR,
1339 1346
           typename NF = typename GR::template NodeMap<bool>,
1340 1347
           typename EF = typename GR::template EdgeMap<bool> >
1341 1348
  class SubGraph :
1342 1349
    public GraphAdaptorExtender<SubGraphBase<GR, NF, EF, true> > {
1343 1350
#endif
1344 1351
  public:
1345 1352
    /// The type of the adapted graph.
1346 1353
    typedef GR Graph;
1347 1354
    /// The type of the node filter map.
1348 1355
    typedef NF NodeFilterMap;
1349 1356
    /// The type of the edge filter map.
1350 1357
    typedef EF EdgeFilterMap;
1351 1358

	
1352 1359
    typedef GraphAdaptorExtender<SubGraphBase<GR, NF, EF, true> >
1353 1360
      Parent;
1354 1361

	
1355 1362
    typedef typename Parent::Node Node;
1356 1363
    typedef typename Parent::Edge Edge;
1357 1364

	
1358 1365
  protected:
1359 1366
    SubGraph() { }
1360 1367
  public:
1361 1368

	
1362 1369
    /// \brief Constructor
1363 1370
    ///
1364 1371
    /// Creates a subgraph for the given graph with the given node
1365 1372
    /// and edge filter maps.
1366 1373
    SubGraph(GR& graph, NF& node_filter, EF& edge_filter) {
1367 1374
      initialize(graph, node_filter, edge_filter);
1368 1375
    }
1369 1376

	
1370 1377
    /// \brief Sets the status of the given node
1371 1378
    ///
1372 1379
    /// This function sets the status of the given node.
1373 1380
    /// It is done by simply setting the assigned value of \c n
1374 1381
    /// to \c v in the node filter map.
1375 1382
    void status(const Node& n, bool v) const { Parent::status(n, v); }
1376 1383

	
1377 1384
    /// \brief Sets the status of the given edge
1378 1385
    ///
1379 1386
    /// This function sets the status of the given edge.
1380 1387
    /// It is done by simply setting the assigned value of \c e
1381 1388
    /// to \c v in the edge filter map.
1382 1389
    void status(const Edge& e, bool v) const { Parent::status(e, v); }
1383 1390

	
1384 1391
    /// \brief Returns the status of the given node
1385 1392
    ///
1386 1393
    /// This function returns the status of the given node.
1387 1394
    /// It is \c true if the given node is enabled (i.e. not hidden).
1388 1395
    bool status(const Node& n) const { return Parent::status(n); }
1389 1396

	
1390 1397
    /// \brief Returns the status of the given edge
1391 1398
    ///
1392 1399
    /// This function returns the status of the given edge.
1393 1400
    /// It is \c true if the given edge is enabled (i.e. not hidden).
1394 1401
    bool status(const Edge& e) const { return Parent::status(e); }
1395 1402

	
1396 1403
    /// \brief Disables the given node
1397 1404
    ///
1398 1405
    /// This function disables the given node in the subdigraph,
1399 1406
    /// so the iteration jumps over it.
1400 1407
    /// It is the same as \ref status() "status(n, false)".
1401 1408
    void disable(const Node& n) const { Parent::status(n, false); }
1402 1409

	
1403 1410
    /// \brief Disables the given edge
1404 1411
    ///
1405 1412
    /// This function disables the given edge in the subgraph,
1406 1413
    /// so the iteration jumps over it.
1407 1414
    /// It is the same as \ref status() "status(e, false)".
1408 1415
    void disable(const Edge& e) const { Parent::status(e, false); }
1409 1416

	
1410 1417
    /// \brief Enables the given node
1411 1418
    ///
1412 1419
    /// This function enables the given node in the subdigraph.
1413 1420
    /// It is the same as \ref status() "status(n, true)".
1414 1421
    void enable(const Node& n) const { Parent::status(n, true); }
1415 1422

	
1416 1423
    /// \brief Enables the given edge
1417 1424
    ///
1418 1425
    /// This function enables the given edge in the subgraph.
1419 1426
    /// It is the same as \ref status() "status(e, true)".
1420 1427
    void enable(const Edge& e) const { Parent::status(e, true); }
1421 1428

	
1422 1429
  };
1423 1430

	
1424 1431
  /// \brief Returns a read-only SubGraph adaptor
1425 1432
  ///
1426 1433
  /// This function just returns a read-only \ref SubGraph adaptor.
1427 1434
  /// \ingroup graph_adaptors
1428 1435
  /// \relates SubGraph
1429 1436
  template<typename GR, typename NF, typename EF>
1430 1437
  SubGraph<const GR, NF, EF>
1431 1438
  subGraph(const GR& graph, NF& node_filter, EF& edge_filter) {
1432 1439
    return SubGraph<const GR, NF, EF>
1433 1440
      (graph, node_filter, edge_filter);
1434 1441
  }
1435 1442

	
1436 1443
  template<typename GR, typename NF, typename EF>
1437 1444
  SubGraph<const GR, const NF, EF>
1438 1445
  subGraph(const GR& graph, const NF& node_filter, EF& edge_filter) {
1439 1446
    return SubGraph<const GR, const NF, EF>
1440 1447
      (graph, node_filter, edge_filter);
1441 1448
  }
1442 1449

	
1443 1450
  template<typename GR, typename NF, typename EF>
1444 1451
  SubGraph<const GR, NF, const EF>
1445 1452
  subGraph(const GR& graph, NF& node_filter, const EF& edge_filter) {
1446 1453
    return SubGraph<const GR, NF, const EF>
1447 1454
      (graph, node_filter, edge_filter);
1448 1455
  }
1449 1456

	
1450 1457
  template<typename GR, typename NF, typename EF>
1451 1458
  SubGraph<const GR, const NF, const EF>
1452 1459
  subGraph(const GR& graph, const NF& node_filter, const EF& edge_filter) {
1453 1460
    return SubGraph<const GR, const NF, const EF>
1454 1461
      (graph, node_filter, edge_filter);
1455 1462
  }
1456 1463

	
1457 1464

	
1458 1465
  /// \ingroup graph_adaptors
1459 1466
  ///
1460 1467
  /// \brief Adaptor class for hiding nodes in a digraph or a graph.
1461 1468
  ///
1462 1469
  /// FilterNodes adaptor can be used for hiding nodes in a digraph or a
1463 1470
  /// graph. A \c bool node map must be specified, which defines the filter
1464 1471
  /// for the nodes. Only the nodes with \c true filter value and the
1465 1472
  /// arcs/edges incident to nodes both with \c true filter value are shown
1466 1473
  /// in the subgraph. This adaptor conforms to the \ref concepts::Digraph
1467 1474
  /// "Digraph" concept or the \ref concepts::Graph "Graph" concept
1468 1475
  /// depending on the \c GR template parameter.
1469 1476
  ///
1470 1477
  /// The adapted (di)graph can also be modified through this adaptor
1471 1478
  /// by adding or removing nodes or arcs/edges, unless the \c GR template
1472 1479
  /// parameter is set to be \c const.
1473 1480
  ///
1481
  /// This class provides only linear time item counting.
1482
  ///
1474 1483
  /// \tparam GR The type of the adapted digraph or graph.
1475 1484
  /// It must conform to the \ref concepts::Digraph "Digraph" concept
1476 1485
  /// or the \ref concepts::Graph "Graph" concept.
1477 1486
  /// It can also be specified to be \c const.
1478 1487
  /// \tparam NF The type of the node filter map.
1479 1488
  /// It must be a \c bool (or convertible) node map of the
1480 1489
  /// adapted (di)graph. The default type is
1481 1490
  /// \ref concepts::Graph::NodeMap "GR::NodeMap<bool>".
1482 1491
  ///
1483 1492
  /// \note The \c Node and <tt>Arc/Edge</tt> types of this adaptor and the
1484 1493
  /// adapted (di)graph are convertible to each other.
1485 1494
#ifdef DOXYGEN
1486 1495
  template<typename GR, typename NF>
1487 1496
  class FilterNodes {
1488 1497
#else
1489 1498
  template<typename GR,
1490 1499
           typename NF = typename GR::template NodeMap<bool>,
1491 1500
           typename Enable = void>
1492 1501
  class FilterNodes :
1493 1502
    public DigraphAdaptorExtender<
1494 1503
      SubDigraphBase<GR, NF, ConstMap<typename GR::Arc, Const<bool, true> >,
1495 1504
                     true> > {
1496 1505
#endif
1497 1506
    typedef DigraphAdaptorExtender<
1498 1507
      SubDigraphBase<GR, NF, ConstMap<typename GR::Arc, Const<bool, true> >, 
1499 1508
                     true> > Parent;
1500 1509

	
1501 1510
  public:
1502 1511

	
1503 1512
    typedef GR Digraph;
1504 1513
    typedef NF NodeFilterMap;
1505 1514

	
1506 1515
    typedef typename Parent::Node Node;
1507 1516

	
1508 1517
  protected:
1509 1518
    ConstMap<typename Digraph::Arc, Const<bool, true> > const_true_map;
1510 1519

	
1511 1520
    FilterNodes() : const_true_map() {}
1512 1521

	
1513 1522
  public:
1514 1523

	
1515 1524
    /// \brief Constructor
1516 1525
    ///
1517 1526
    /// Creates a subgraph for the given digraph or graph with the
1518 1527
    /// given node filter map.
1519 1528
    FilterNodes(GR& graph, NF& node_filter) 
1520 1529
      : Parent(), const_true_map()
1521 1530
    {
1522 1531
      Parent::initialize(graph, node_filter, const_true_map);
1523 1532
    }
1524 1533

	
1525 1534
    /// \brief Sets the status of the given node
1526 1535
    ///
1527 1536
    /// This function sets the status of the given node.
1528 1537
    /// It is done by simply setting the assigned value of \c n
1529 1538
    /// to \c v in the node filter map.
1530 1539
    void status(const Node& n, bool v) const { Parent::status(n, v); }
1531 1540

	
1532 1541
    /// \brief Returns the status of the given node
1533 1542
    ///
1534 1543
    /// This function returns the status of the given node.
1535 1544
    /// It is \c true if the given node is enabled (i.e. not hidden).
1536 1545
    bool status(const Node& n) const { return Parent::status(n); }
1537 1546

	
1538 1547
    /// \brief Disables the given node
1539 1548
    ///
1540 1549
    /// This function disables the given node, so the iteration
1541 1550
    /// jumps over it.
1542 1551
    /// It is the same as \ref status() "status(n, false)".
1543 1552
    void disable(const Node& n) const { Parent::status(n, false); }
1544 1553

	
1545 1554
    /// \brief Enables the given node
1546 1555
    ///
1547 1556
    /// This function enables the given node.
1548 1557
    /// It is the same as \ref status() "status(n, true)".
1549 1558
    void enable(const Node& n) const { Parent::status(n, true); }
1550 1559

	
1551 1560
  };
1552 1561

	
1553 1562
  template<typename GR, typename NF>
1554 1563
  class FilterNodes<GR, NF,
1555 1564
                    typename enable_if<UndirectedTagIndicator<GR> >::type> :
1556 1565
    public GraphAdaptorExtender<
1557 1566
      SubGraphBase<GR, NF, ConstMap<typename GR::Edge, Const<bool, true> >, 
1558 1567
                   true> > {
1559 1568

	
1560 1569
    typedef GraphAdaptorExtender<
1561 1570
      SubGraphBase<GR, NF, ConstMap<typename GR::Edge, Const<bool, true> >, 
1562 1571
                   true> > Parent;
1563 1572

	
1564 1573
  public:
1565 1574

	
1566 1575
    typedef GR Graph;
1567 1576
    typedef NF NodeFilterMap;
1568 1577

	
1569 1578
    typedef typename Parent::Node Node;
1570 1579

	
1571 1580
  protected:
1572 1581
    ConstMap<typename GR::Edge, Const<bool, true> > const_true_map;
1573 1582

	
1574 1583
    FilterNodes() : const_true_map() {}
1575 1584

	
1576 1585
  public:
1577 1586

	
1578 1587
    FilterNodes(GR& graph, NodeFilterMap& node_filter) :
1579 1588
      Parent(), const_true_map() {
1580 1589
      Parent::initialize(graph, node_filter, const_true_map);
1581 1590
    }
1582 1591

	
1583 1592
    void status(const Node& n, bool v) const { Parent::status(n, v); }
1584 1593
    bool status(const Node& n) const { return Parent::status(n); }
1585 1594
    void disable(const Node& n) const { Parent::status(n, false); }
1586 1595
    void enable(const Node& n) const { Parent::status(n, true); }
1587 1596

	
1588 1597
  };
1589 1598

	
1590 1599

	
1591 1600
  /// \brief Returns a read-only FilterNodes adaptor
1592 1601
  ///
1593 1602
  /// This function just returns a read-only \ref FilterNodes adaptor.
1594 1603
  /// \ingroup graph_adaptors
1595 1604
  /// \relates FilterNodes
1596 1605
  template<typename GR, typename NF>
1597 1606
  FilterNodes<const GR, NF>
1598 1607
  filterNodes(const GR& graph, NF& node_filter) {
1599 1608
    return FilterNodes<const GR, NF>(graph, node_filter);
1600 1609
  }
1601 1610

	
1602 1611
  template<typename GR, typename NF>
1603 1612
  FilterNodes<const GR, const NF>
1604 1613
  filterNodes(const GR& graph, const NF& node_filter) {
1605 1614
    return FilterNodes<const GR, const NF>(graph, node_filter);
1606 1615
  }
1607 1616

	
1608 1617
  /// \ingroup graph_adaptors
1609 1618
  ///
1610 1619
  /// \brief Adaptor class for hiding arcs in a digraph.
1611 1620
  ///
1612 1621
  /// FilterArcs adaptor can be used for hiding arcs in a digraph.
1613 1622
  /// A \c bool arc map must be specified, which defines the filter for
1614 1623
  /// the arcs. Only the arcs with \c true filter value are shown in the
1615 1624
  /// subdigraph. This adaptor conforms to the \ref concepts::Digraph
1616 1625
  /// "Digraph" concept.
1617 1626
  ///
1618 1627
  /// The adapted digraph can also be modified through this adaptor
1619 1628
  /// by adding or removing nodes or arcs, unless the \c GR template
1620 1629
  /// parameter is set to be \c const.
1621 1630
  ///
1631
  /// This class provides only linear time counting for nodes and arcs.
1632
  ///
1622 1633
  /// \tparam DGR The type of the adapted digraph.
1623 1634
  /// It must conform to the \ref concepts::Digraph "Digraph" concept.
1624 1635
  /// It can also be specified to be \c const.
1625 1636
  /// \tparam AF The type of the arc filter map.
1626 1637
  /// It must be a \c bool (or convertible) arc map of the
1627 1638
  /// adapted digraph. The default type is
1628 1639
  /// \ref concepts::Digraph::ArcMap "DGR::ArcMap<bool>".
1629 1640
  ///
1630 1641
  /// \note The \c Node and \c Arc types of this adaptor and the adapted
1631 1642
  /// digraph are convertible to each other.
1632 1643
#ifdef DOXYGEN
1633 1644
  template<typename DGR,
1634 1645
           typename AF>
1635 1646
  class FilterArcs {
1636 1647
#else
1637 1648
  template<typename DGR,
1638 1649
           typename AF = typename DGR::template ArcMap<bool> >
1639 1650
  class FilterArcs :
1640 1651
    public DigraphAdaptorExtender<
1641 1652
      SubDigraphBase<DGR, ConstMap<typename DGR::Node, Const<bool, true> >,
1642 1653
                     AF, false> > {
1643 1654
#endif
1644 1655
    typedef DigraphAdaptorExtender<
1645 1656
      SubDigraphBase<DGR, ConstMap<typename DGR::Node, Const<bool, true> >, 
1646 1657
                     AF, false> > Parent;
1647 1658

	
1648 1659
  public:
1649 1660

	
1650 1661
    /// The type of the adapted digraph.
1651 1662
    typedef DGR Digraph;
1652 1663
    /// The type of the arc filter map.
1653 1664
    typedef AF ArcFilterMap;
1654 1665

	
1655 1666
    typedef typename Parent::Arc Arc;
1656 1667

	
1657 1668
  protected:
1658 1669
    ConstMap<typename DGR::Node, Const<bool, true> > const_true_map;
1659 1670

	
1660 1671
    FilterArcs() : const_true_map() {}
1661 1672

	
1662 1673
  public:
1663 1674

	
1664 1675
    /// \brief Constructor
1665 1676
    ///
1666 1677
    /// Creates a subdigraph for the given digraph with the given arc
1667 1678
    /// filter map.
1668 1679
    FilterArcs(DGR& digraph, ArcFilterMap& arc_filter)
1669 1680
      : Parent(), const_true_map() {
1670 1681
      Parent::initialize(digraph, const_true_map, arc_filter);
1671 1682
    }
1672 1683

	
1673 1684
    /// \brief Sets the status of the given arc
1674 1685
    ///
1675 1686
    /// This function sets the status of the given arc.
1676 1687
    /// It is done by simply setting the assigned value of \c a
1677 1688
    /// to \c v in the arc filter map.
1678 1689
    void status(const Arc& a, bool v) const { Parent::status(a, v); }
1679 1690

	
1680 1691
    /// \brief Returns the status of the given arc
1681 1692
    ///
1682 1693
    /// This function returns the status of the given arc.
1683 1694
    /// It is \c true if the given arc is enabled (i.e. not hidden).
1684 1695
    bool status(const Arc& a) const { return Parent::status(a); }
1685 1696

	
1686 1697
    /// \brief Disables the given arc
1687 1698
    ///
1688 1699
    /// This function disables the given arc in the subdigraph,
1689 1700
    /// so the iteration jumps over it.
1690 1701
    /// It is the same as \ref status() "status(a, false)".
1691 1702
    void disable(const Arc& a) const { Parent::status(a, false); }
1692 1703

	
1693 1704
    /// \brief Enables the given arc
1694 1705
    ///
1695 1706
    /// This function enables the given arc in the subdigraph.
1696 1707
    /// It is the same as \ref status() "status(a, true)".
1697 1708
    void enable(const Arc& a) const { Parent::status(a, true); }
1698 1709

	
1699 1710
  };
1700 1711

	
1701 1712
  /// \brief Returns a read-only FilterArcs adaptor
1702 1713
  ///
1703 1714
  /// This function just returns a read-only \ref FilterArcs adaptor.
1704 1715
  /// \ingroup graph_adaptors
1705 1716
  /// \relates FilterArcs
1706 1717
  template<typename DGR, typename AF>
1707 1718
  FilterArcs<const DGR, AF>
1708 1719
  filterArcs(const DGR& digraph, AF& arc_filter) {
1709 1720
    return FilterArcs<const DGR, AF>(digraph, arc_filter);
1710 1721
  }
1711 1722

	
1712 1723
  template<typename DGR, typename AF>
1713 1724
  FilterArcs<const DGR, const AF>
1714 1725
  filterArcs(const DGR& digraph, const AF& arc_filter) {
1715 1726
    return FilterArcs<const DGR, const AF>(digraph, arc_filter);
1716 1727
  }
1717 1728

	
1718 1729
  /// \ingroup graph_adaptors
1719 1730
  ///
1720 1731
  /// \brief Adaptor class for hiding edges in a graph.
1721 1732
  ///
1722 1733
  /// FilterEdges adaptor can be used for hiding edges in a graph.
1723 1734
  /// A \c bool edge map must be specified, which defines the filter for
1724 1735
  /// the edges. Only the edges with \c true filter value are shown in the
1725 1736
  /// subgraph. This adaptor conforms to the \ref concepts::Graph
1726 1737
  /// "Graph" concept.
1727 1738
  ///
1728 1739
  /// The adapted graph can also be modified through this adaptor
1729 1740
  /// by adding or removing nodes or edges, unless the \c GR template
1730 1741
  /// parameter is set to be \c const.
1731 1742
  ///
1743
  /// This class provides only linear time counting for nodes, edges and arcs.
1744
  ///
1732 1745
  /// \tparam GR The type of the adapted graph.
1733 1746
  /// It must conform to the \ref concepts::Graph "Graph" concept.
1734 1747
  /// It can also be specified to be \c const.
1735 1748
  /// \tparam EF The type of the edge filter map.
1736 1749
  /// It must be a \c bool (or convertible) edge map of the
1737 1750
  /// adapted graph. The default type is
1738 1751
  /// \ref concepts::Graph::EdgeMap "GR::EdgeMap<bool>".
1739 1752
  ///
1740 1753
  /// \note The \c Node, \c Edge and \c Arc types of this adaptor and the
1741 1754
  /// adapted graph are convertible to each other.
1742 1755
#ifdef DOXYGEN
1743 1756
  template<typename GR,
1744 1757
           typename EF>
1745 1758
  class FilterEdges {
1746 1759
#else
1747 1760
  template<typename GR,
1748 1761
           typename EF = typename GR::template EdgeMap<bool> >
1749 1762
  class FilterEdges :
1750 1763
    public GraphAdaptorExtender<
1751 1764
      SubGraphBase<GR, ConstMap<typename GR::Node, Const<bool, true> >, 
1752 1765
                   EF, false> > {
1753 1766
#endif
1754 1767
    typedef GraphAdaptorExtender<
1755 1768
      SubGraphBase<GR, ConstMap<typename GR::Node, Const<bool, true > >, 
1756 1769
                   EF, false> > Parent;
1757 1770

	
1758 1771
  public:
1759 1772

	
1760 1773
    /// The type of the adapted graph.
1761 1774
    typedef GR Graph;
1762 1775
    /// The type of the edge filter map.
1763 1776
    typedef EF EdgeFilterMap;
1764 1777

	
1765 1778
    typedef typename Parent::Edge Edge;
1766 1779

	
1767 1780
  protected:
1768 1781
    ConstMap<typename GR::Node, Const<bool, true> > const_true_map;
1769 1782

	
1770 1783
    FilterEdges() : const_true_map(true) {
1771 1784
      Parent::setNodeFilterMap(const_true_map);
1772 1785
    }
1773 1786

	
1774 1787
  public:
1775 1788

	
1776 1789
    /// \brief Constructor
1777 1790
    ///
1778 1791
    /// Creates a subgraph for the given graph with the given edge
1779 1792
    /// filter map.
1780 1793
    FilterEdges(GR& graph, EF& edge_filter) 
1781 1794
      : Parent(), const_true_map() {
1782 1795
      Parent::initialize(graph, const_true_map, edge_filter);
1783 1796
    }
1784 1797

	
1785 1798
    /// \brief Sets the status of the given edge
1786 1799
    ///
1787 1800
    /// This function sets the status of the given edge.
1788 1801
    /// It is done by simply setting the assigned value of \c e
1789 1802
    /// to \c v in the edge filter map.
1790 1803
    void status(const Edge& e, bool v) const { Parent::status(e, v); }
1791 1804

	
1792 1805
    /// \brief Returns the status of the given edge
1793 1806
    ///
1794 1807
    /// This function returns the status of the given edge.
1795 1808
    /// It is \c true if the given edge is enabled (i.e. not hidden).
1796 1809
    bool status(const Edge& e) const { return Parent::status(e); }
1797 1810

	
1798 1811
    /// \brief Disables the given edge
1799 1812
    ///
1800 1813
    /// This function disables the given edge in the subgraph,
1801 1814
    /// so the iteration jumps over it.
1802 1815
    /// It is the same as \ref status() "status(e, false)".
1803 1816
    void disable(const Edge& e) const { Parent::status(e, false); }
1804 1817

	
1805 1818
    /// \brief Enables the given edge
1806 1819
    ///
1807 1820
    /// This function enables the given edge in the subgraph.
1808 1821
    /// It is the same as \ref status() "status(e, true)".
1809 1822
    void enable(const Edge& e) const { Parent::status(e, true); }
1810 1823

	
1811 1824
  };
1812 1825

	
1813 1826
  /// \brief Returns a read-only FilterEdges adaptor
1814 1827
  ///
1815 1828
  /// This function just returns a read-only \ref FilterEdges adaptor.
1816 1829
  /// \ingroup graph_adaptors
1817 1830
  /// \relates FilterEdges
1818 1831
  template<typename GR, typename EF>
1819 1832
  FilterEdges<const GR, EF>
1820 1833
  filterEdges(const GR& graph, EF& edge_filter) {
1821 1834
    return FilterEdges<const GR, EF>(graph, edge_filter);
1822 1835
  }
1823 1836

	
1824 1837
  template<typename GR, typename EF>
1825 1838
  FilterEdges<const GR, const EF>
1826 1839
  filterEdges(const GR& graph, const EF& edge_filter) {
1827 1840
    return FilterEdges<const GR, const EF>(graph, edge_filter);
1828 1841
  }
1829 1842

	
1830 1843

	
1831 1844
  template <typename DGR>
1832 1845
  class UndirectorBase {
1833 1846
  public:
1834 1847
    typedef DGR Digraph;
1835 1848
    typedef UndirectorBase Adaptor;
1836 1849

	
1837 1850
    typedef True UndirectedTag;
1838 1851

	
1839 1852
    typedef typename Digraph::Arc Edge;
1840 1853
    typedef typename Digraph::Node Node;
1841 1854

	
1842 1855
    class Arc {
1843 1856
      friend class UndirectorBase;
1844 1857
    protected:
1845 1858
      Edge _edge;
1846 1859
      bool _forward;
1847 1860

	
1848 1861
      Arc(const Edge& edge, bool forward) 
1849 1862
        : _edge(edge), _forward(forward) {}
1850 1863

	
1851 1864
    public:
1852 1865
      Arc() {}
1853 1866

	
1854 1867
      Arc(Invalid) : _edge(INVALID), _forward(true) {}
1855 1868

	
1856 1869
      operator const Edge&() const { return _edge; }
1857 1870

	
1858 1871
      bool operator==(const Arc &other) const {
1859 1872
        return _forward == other._forward && _edge == other._edge;
1860 1873
      }
1861 1874
      bool operator!=(const Arc &other) const {
1862 1875
        return _forward != other._forward || _edge != other._edge;
1863 1876
      }
1864 1877
      bool operator<(const Arc &other) const {
1865 1878
        return _forward < other._forward ||
1866 1879
          (_forward == other._forward && _edge < other._edge);
1867 1880
      }
1868 1881
    };
1869 1882

	
1870 1883
    void first(Node& n) const {
1871 1884
      _digraph->first(n);
1872 1885
    }
1873 1886

	
1874 1887
    void next(Node& n) const {
1875 1888
      _digraph->next(n);
1876 1889
    }
1877 1890

	
1878 1891
    void first(Arc& a) const {
1879 1892
      _digraph->first(a._edge);
1880 1893
      a._forward = true;
1881 1894
    }
1882 1895

	
1883 1896
    void next(Arc& a) const {
1884 1897
      if (a._forward) {
1885 1898
        a._forward = false;
1886 1899
      } else {
1887 1900
        _digraph->next(a._edge);
1888 1901
        a._forward = true;
1889 1902
      }
1890 1903
    }
1891 1904

	
1892 1905
    void first(Edge& e) const {
1893 1906
      _digraph->first(e);
1894 1907
    }
1895 1908

	
1896 1909
    void next(Edge& e) const {
1897 1910
      _digraph->next(e);
1898 1911
    }
1899 1912

	
1900 1913
    void firstOut(Arc& a, const Node& n) const {
1901 1914
      _digraph->firstIn(a._edge, n);
1902 1915
      if (a._edge != INVALID ) {
1903 1916
        a._forward = false;
1904 1917
      } else {
1905 1918
        _digraph->firstOut(a._edge, n);
1906 1919
        a._forward = true;
1907 1920
      }
1908 1921
    }
1909 1922
    void nextOut(Arc &a) const {
1910 1923
      if (!a._forward) {
1911 1924
        Node n = _digraph->target(a._edge);
1912 1925
        _digraph->nextIn(a._edge);
1913 1926
        if (a._edge == INVALID) {
1914 1927
          _digraph->firstOut(a._edge, n);
1915 1928
          a._forward = true;
1916 1929
        }
1917 1930
      }
1918 1931
      else {
1919 1932
        _digraph->nextOut(a._edge);
1920 1933
      }
1921 1934
    }
1922 1935

	
1923 1936
    void firstIn(Arc &a, const Node &n) const {
1924 1937
      _digraph->firstOut(a._edge, n);
1925 1938
      if (a._edge != INVALID ) {
1926 1939
        a._forward = false;
1927 1940
      } else {
1928 1941
        _digraph->firstIn(a._edge, n);
1929 1942
        a._forward = true;
1930 1943
      }
1931 1944
    }
1932 1945
    void nextIn(Arc &a) const {
1933 1946
      if (!a._forward) {
1934 1947
        Node n = _digraph->source(a._edge);
1935 1948
        _digraph->nextOut(a._edge);
1936 1949
        if (a._edge == INVALID ) {
1937 1950
          _digraph->firstIn(a._edge, n);
1938 1951
          a._forward = true;
1939 1952
        }
1940 1953
      }
1941 1954
      else {
1942 1955
        _digraph->nextIn(a._edge);
1943 1956
      }
1944 1957
    }
1945 1958

	
1946 1959
    void firstInc(Edge &e, bool &d, const Node &n) const {
1947 1960
      d = true;
1948 1961
      _digraph->firstOut(e, n);
1949 1962
      if (e != INVALID) return;
1950 1963
      d = false;
1951 1964
      _digraph->firstIn(e, n);
1952 1965
    }
1953 1966

	
1954 1967
    void nextInc(Edge &e, bool &d) const {
1955 1968
      if (d) {
1956 1969
        Node s = _digraph->source(e);
1957 1970
        _digraph->nextOut(e);
1958 1971
        if (e != INVALID) return;
1959 1972
        d = false;
1960 1973
        _digraph->firstIn(e, s);
1961 1974
      } else {
1962 1975
        _digraph->nextIn(e);
1963 1976
      }
1964 1977
    }
1965 1978

	
1966 1979
    Node u(const Edge& e) const {
1967 1980
      return _digraph->source(e);
1968 1981
    }
1969 1982

	
1970 1983
    Node v(const Edge& e) const {
1971 1984
      return _digraph->target(e);
1972 1985
    }
1973 1986

	
1974 1987
    Node source(const Arc &a) const {
1975 1988
      return a._forward ? _digraph->source(a._edge) : _digraph->target(a._edge);
1976 1989
    }
1977 1990

	
1978 1991
    Node target(const Arc &a) const {
1979 1992
      return a._forward ? _digraph->target(a._edge) : _digraph->source(a._edge);
1980 1993
    }
1981 1994

	
1982 1995
    static Arc direct(const Edge &e, bool d) {
1983 1996
      return Arc(e, d);
1984 1997
    }
1985 1998

	
1986 1999
    static bool direction(const Arc &a) { return a._forward; }
1987 2000

	
1988 2001
    Node nodeFromId(int ix) const { return _digraph->nodeFromId(ix); }
1989 2002
    Arc arcFromId(int ix) const {
1990 2003
      return direct(_digraph->arcFromId(ix >> 1), bool(ix & 1));
1991 2004
    }
1992 2005
    Edge edgeFromId(int ix) const { return _digraph->arcFromId(ix); }
1993 2006

	
1994 2007
    int id(const Node &n) const { return _digraph->id(n); }
1995 2008
    int id(const Arc &a) const {
1996 2009
      return  (_digraph->id(a) << 1) | (a._forward ? 1 : 0);
1997 2010
    }
1998 2011
    int id(const Edge &e) const { return _digraph->id(e); }
1999 2012

	
2000 2013
    int maxNodeId() const { return _digraph->maxNodeId(); }
2001 2014
    int maxArcId() const { return (_digraph->maxArcId() << 1) | 1; }
2002 2015
    int maxEdgeId() const { return _digraph->maxArcId(); }
2003 2016

	
2004 2017
    Node addNode() { return _digraph->addNode(); }
2005 2018
    Edge addEdge(const Node& u, const Node& v) {
2006 2019
      return _digraph->addArc(u, v);
2007 2020
    }
2008 2021

	
2009 2022
    void erase(const Node& i) { _digraph->erase(i); }
2010 2023
    void erase(const Edge& i) { _digraph->erase(i); }
2011 2024

	
2012 2025
    void clear() { _digraph->clear(); }
2013 2026

	
2014 2027
    typedef NodeNumTagIndicator<Digraph> NodeNumTag;
2015 2028
    int nodeNum() const { return _digraph->nodeNum(); }
2016 2029

	
2017 2030
    typedef ArcNumTagIndicator<Digraph> ArcNumTag;
2018 2031
    int arcNum() const { return 2 * _digraph->arcNum(); }
2019 2032

	
2020 2033
    typedef ArcNumTag EdgeNumTag;
2021 2034
    int edgeNum() const { return _digraph->arcNum(); }
2022 2035

	
2023 2036
    typedef FindArcTagIndicator<Digraph> FindArcTag;
2024 2037
    Arc findArc(Node s, Node t, Arc p = INVALID) const {
2025 2038
      if (p == INVALID) {
2026 2039
        Edge arc = _digraph->findArc(s, t);
2027 2040
        if (arc != INVALID) return direct(arc, true);
2028 2041
        arc = _digraph->findArc(t, s);
2029 2042
        if (arc != INVALID) return direct(arc, false);
2030 2043
      } else if (direction(p)) {
2031 2044
        Edge arc = _digraph->findArc(s, t, p);
2032 2045
        if (arc != INVALID) return direct(arc, true);
2033 2046
        arc = _digraph->findArc(t, s);
2034 2047
        if (arc != INVALID) return direct(arc, false);
2035 2048
      } else {
2036 2049
        Edge arc = _digraph->findArc(t, s, p);
2037 2050
        if (arc != INVALID) return direct(arc, false);
2038 2051
      }
2039 2052
      return INVALID;
2040 2053
    }
2041 2054

	
2042 2055
    typedef FindArcTag FindEdgeTag;
2043 2056
    Edge findEdge(Node s, Node t, Edge p = INVALID) const {
2044 2057
      if (s != t) {
2045 2058
        if (p == INVALID) {
2046 2059
          Edge arc = _digraph->findArc(s, t);
2047 2060
          if (arc != INVALID) return arc;
2048 2061
          arc = _digraph->findArc(t, s);
2049 2062
          if (arc != INVALID) return arc;
2050 2063
        } else if (_digraph->source(p) == s) {
2051 2064
          Edge arc = _digraph->findArc(s, t, p);
2052 2065
          if (arc != INVALID) return arc;
2053 2066
          arc = _digraph->findArc(t, s);
2054 2067
          if (arc != INVALID) return arc;
2055 2068
        } else {
2056 2069
          Edge arc = _digraph->findArc(t, s, p);
2057 2070
          if (arc != INVALID) return arc;
2058 2071
        }
2059 2072
      } else {
2060 2073
        return _digraph->findArc(s, t, p);
2061 2074
      }
2062 2075
      return INVALID;
2063 2076
    }
2064 2077

	
2065 2078
  private:
2066 2079

	
2067 2080
    template <typename V>
2068 2081
    class ArcMapBase {
2069 2082
    private:
2070 2083

	
2071 2084
      typedef typename DGR::template ArcMap<V> MapImpl;
2072 2085

	
2073 2086
    public:
2074 2087

	
2075 2088
      typedef typename MapTraits<MapImpl>::ReferenceMapTag ReferenceMapTag;
2076 2089

	
2077 2090
      typedef V Value;
2078 2091
      typedef Arc Key;
2079 2092
      typedef typename MapTraits<MapImpl>::ConstReturnValue ConstReturnValue;
2080 2093
      typedef typename MapTraits<MapImpl>::ReturnValue ReturnValue;
2081 2094
      typedef typename MapTraits<MapImpl>::ConstReturnValue ConstReference;
2082 2095
      typedef typename MapTraits<MapImpl>::ReturnValue Reference;
2083 2096

	
2084 2097
      ArcMapBase(const UndirectorBase<DGR>& adaptor) :
2085 2098
        _forward(*adaptor._digraph), _backward(*adaptor._digraph) {}
2086 2099

	
2087 2100
      ArcMapBase(const UndirectorBase<DGR>& adaptor, const V& value)
2088 2101
        : _forward(*adaptor._digraph, value), 
2089 2102
          _backward(*adaptor._digraph, value) {}
2090 2103

	
2091 2104
      void set(const Arc& a, const V& value) {
2092 2105
        if (direction(a)) {
2093 2106
          _forward.set(a, value);
2094 2107
        } else {
2095 2108
          _backward.set(a, value);
2096 2109
        }
2097 2110
      }
2098 2111

	
2099 2112
      ConstReturnValue operator[](const Arc& a) const {
2100 2113
        if (direction(a)) {
2101 2114
          return _forward[a];
2102 2115
        } else {
2103 2116
          return _backward[a];
2104 2117
        }
2105 2118
      }
2106 2119

	
2107 2120
      ReturnValue operator[](const Arc& a) {
2108 2121
        if (direction(a)) {
2109 2122
          return _forward[a];
2110 2123
        } else {
2111 2124
          return _backward[a];
2112 2125
        }
2113 2126
      }
2114 2127

	
2115 2128
    protected:
2116 2129

	
2117 2130
      MapImpl _forward, _backward;
2118 2131

	
2119 2132
    };
2120 2133

	
2121 2134
  public:
2122 2135

	
2123 2136
    template <typename V>
2124 2137
    class NodeMap : public DGR::template NodeMap<V> {
2125 2138
      typedef typename DGR::template NodeMap<V> Parent;
2126 2139

	
2127 2140
    public:
2128 2141
      typedef V Value;
2129 2142

	
2130 2143
      explicit NodeMap(const UndirectorBase<DGR>& adaptor)
2131 2144
        : Parent(*adaptor._digraph) {}
2132 2145

	
2133 2146
      NodeMap(const UndirectorBase<DGR>& adaptor, const V& value)
2134 2147
        : Parent(*adaptor._digraph, value) { }
2135 2148

	
2136 2149
    private:
2137 2150
      NodeMap& operator=(const NodeMap& cmap) {
2138 2151
        return operator=<NodeMap>(cmap);
2139 2152
      }
2140 2153

	
2141 2154
      template <typename CMap>
2142 2155
      NodeMap& operator=(const CMap& cmap) {
2143 2156
        Parent::operator=(cmap);
2144 2157
        return *this;
2145 2158
      }
2146 2159

	
2147 2160
    };
2148 2161

	
2149 2162
    template <typename V>
2150 2163
    class ArcMap
2151 2164
      : public SubMapExtender<UndirectorBase<DGR>, ArcMapBase<V> > {
2152 2165
      typedef SubMapExtender<UndirectorBase<DGR>, ArcMapBase<V> > Parent;
2153 2166

	
2154 2167
    public:
2155 2168
      typedef V Value;
2156 2169

	
2157 2170
      explicit ArcMap(const UndirectorBase<DGR>& adaptor)
2158 2171
        : Parent(adaptor) {}
2159 2172

	
2160 2173
      ArcMap(const UndirectorBase<DGR>& adaptor, const V& value)
2161 2174
        : Parent(adaptor, value) {}
2162 2175

	
2163 2176
    private:
2164 2177
      ArcMap& operator=(const ArcMap& cmap) {
2165 2178
        return operator=<ArcMap>(cmap);
2166 2179
      }
2167 2180

	
2168 2181
      template <typename CMap>
2169 2182
      ArcMap& operator=(const CMap& cmap) {
2170 2183
        Parent::operator=(cmap);
2171 2184
        return *this;
2172 2185
      }
2173 2186
    };
2174 2187

	
2175 2188
    template <typename V>
2176 2189
    class EdgeMap : public Digraph::template ArcMap<V> {
2177 2190
      typedef typename Digraph::template ArcMap<V> Parent;
2178 2191

	
2179 2192
    public:
2180 2193
      typedef V Value;
2181 2194

	
2182 2195
      explicit EdgeMap(const UndirectorBase<DGR>& adaptor)
2183 2196
        : Parent(*adaptor._digraph) {}
2184 2197

	
2185 2198
      EdgeMap(const UndirectorBase<DGR>& adaptor, const V& value)
2186 2199
        : Parent(*adaptor._digraph, value) {}
2187 2200

	
2188 2201
    private:
2189 2202
      EdgeMap& operator=(const EdgeMap& cmap) {
2190 2203
        return operator=<EdgeMap>(cmap);
2191 2204
      }
2192 2205

	
2193 2206
      template <typename CMap>
2194 2207
      EdgeMap& operator=(const CMap& cmap) {
2195 2208
        Parent::operator=(cmap);
2196 2209
        return *this;
2197 2210
      }
2198 2211

	
2199 2212
    };
2200 2213

	
2201 2214
    typedef typename ItemSetTraits<DGR, Node>::ItemNotifier NodeNotifier;
2202 2215
    NodeNotifier& notifier(Node) const { return _digraph->notifier(Node()); }
2203 2216

	
2204 2217
    typedef typename ItemSetTraits<DGR, Edge>::ItemNotifier EdgeNotifier;
2205 2218
    EdgeNotifier& notifier(Edge) const { return _digraph->notifier(Edge()); }
2206 2219
    
2207 2220
    typedef EdgeNotifier ArcNotifier;
2208 2221
    ArcNotifier& notifier(Arc) const { return _digraph->notifier(Edge()); }
2209 2222

	
2210 2223
  protected:
2211 2224

	
2212 2225
    UndirectorBase() : _digraph(0) {}
2213 2226

	
2214 2227
    DGR* _digraph;
2215 2228

	
2216 2229
    void initialize(DGR& digraph) {
2217 2230
      _digraph = &digraph;
2218 2231
    }
2219 2232

	
2220 2233
  };
2221 2234

	
2222 2235
  /// \ingroup graph_adaptors
2223 2236
  ///
2224 2237
  /// \brief Adaptor class for viewing a digraph as an undirected graph.
2225 2238
  ///
2226 2239
  /// Undirector adaptor can be used for viewing a digraph as an undirected
2227 2240
  /// graph. All arcs of the underlying digraph are showed in the
2228 2241
  /// adaptor as an edge (and also as a pair of arcs, of course).
2229 2242
  /// This adaptor conforms to the \ref concepts::Graph "Graph" concept.
2230 2243
  ///
2231 2244
  /// The adapted digraph can also be modified through this adaptor
2232 2245
  /// by adding or removing nodes or edges, unless the \c GR template
2233 2246
  /// parameter is set to be \c const.
2234 2247
  ///
2248
  /// This class provides item counting in the same time as the adapted
2249
  /// digraph structure.
2250
  ///
2235 2251
  /// \tparam DGR The type of the adapted digraph.
2236 2252
  /// It must conform to the \ref concepts::Digraph "Digraph" concept.
2237 2253
  /// It can also be specified to be \c const.
2238 2254
  ///
2239 2255
  /// \note The \c Node type of this adaptor and the adapted digraph are
2240 2256
  /// convertible to each other, moreover the \c Edge type of the adaptor
2241 2257
  /// and the \c Arc type of the adapted digraph are also convertible to
2242 2258
  /// each other.
2243 2259
  /// (Thus the \c Arc type of the adaptor is convertible to the \c Arc type
2244 2260
  /// of the adapted digraph.)
2245 2261
  template<typename DGR>
2246 2262
#ifdef DOXYGEN
2247 2263
  class Undirector {
2248 2264
#else
2249 2265
  class Undirector :
2250 2266
    public GraphAdaptorExtender<UndirectorBase<DGR> > {
2251 2267
#endif
2252 2268
    typedef GraphAdaptorExtender<UndirectorBase<DGR> > Parent;
2253 2269
  public:
2254 2270
    /// The type of the adapted digraph.
2255 2271
    typedef DGR Digraph;
2256 2272
  protected:
2257 2273
    Undirector() { }
2258 2274
  public:
2259 2275

	
2260 2276
    /// \brief Constructor
2261 2277
    ///
2262 2278
    /// Creates an undirected graph from the given digraph.
2263 2279
    Undirector(DGR& digraph) {
2264 2280
      initialize(digraph);
2265 2281
    }
2266 2282

	
2267 2283
    /// \brief Arc map combined from two original arc maps
2268 2284
    ///
2269 2285
    /// This map adaptor class adapts two arc maps of the underlying
2270 2286
    /// digraph to get an arc map of the undirected graph.
2271 2287
    /// Its value type is inherited from the first arc map type (\c FW).
2272 2288
    /// \tparam FW The type of the "foward" arc map.
2273 2289
    /// \tparam BK The type of the "backward" arc map.
2274 2290
    template <typename FW, typename BK>
2275 2291
    class CombinedArcMap {
2276 2292
    public:
2277 2293

	
2278 2294
      /// The key type of the map
2279 2295
      typedef typename Parent::Arc Key;
2280 2296
      /// The value type of the map
2281 2297
      typedef typename FW::Value Value;
2282 2298

	
2283 2299
      typedef typename MapTraits<FW>::ReferenceMapTag ReferenceMapTag;
2284 2300

	
2285 2301
      typedef typename MapTraits<FW>::ReturnValue ReturnValue;
2286 2302
      typedef typename MapTraits<FW>::ConstReturnValue ConstReturnValue;
2287 2303
      typedef typename MapTraits<FW>::ReturnValue Reference;
2288 2304
      typedef typename MapTraits<FW>::ConstReturnValue ConstReference;
2289 2305

	
2290 2306
      /// Constructor
2291 2307
      CombinedArcMap(FW& forward, BK& backward)
2292 2308
        : _forward(&forward), _backward(&backward) {}
2293 2309

	
2294 2310
      /// Sets the value associated with the given key.
2295 2311
      void set(const Key& e, const Value& a) {
2296 2312
        if (Parent::direction(e)) {
2297 2313
          _forward->set(e, a);
2298 2314
        } else {
2299 2315
          _backward->set(e, a);
2300 2316
        }
2301 2317
      }
2302 2318

	
2303 2319
      /// Returns the value associated with the given key.
2304 2320
      ConstReturnValue operator[](const Key& e) const {
2305 2321
        if (Parent::direction(e)) {
2306 2322
          return (*_forward)[e];
2307 2323
        } else {
2308 2324
          return (*_backward)[e];
2309 2325
        }
2310 2326
      }
2311 2327

	
2312 2328
      /// Returns a reference to the value associated with the given key.
2313 2329
      ReturnValue operator[](const Key& e) {
2314 2330
        if (Parent::direction(e)) {
2315 2331
          return (*_forward)[e];
2316 2332
        } else {
2317 2333
          return (*_backward)[e];
2318 2334
        }
2319 2335
      }
2320 2336

	
2321 2337
    protected:
2322 2338

	
2323 2339
      FW* _forward;
2324 2340
      BK* _backward;
2325 2341

	
2326 2342
    };
2327 2343

	
2328 2344
    /// \brief Returns a combined arc map
2329 2345
    ///
2330 2346
    /// This function just returns a combined arc map.
2331 2347
    template <typename FW, typename BK>
2332 2348
    static CombinedArcMap<FW, BK>
2333 2349
    combinedArcMap(FW& forward, BK& backward) {
2334 2350
      return CombinedArcMap<FW, BK>(forward, backward);
2335 2351
    }
2336 2352

	
2337 2353
    template <typename FW, typename BK>
2338 2354
    static CombinedArcMap<const FW, BK>
2339 2355
    combinedArcMap(const FW& forward, BK& backward) {
2340 2356
      return CombinedArcMap<const FW, BK>(forward, backward);
2341 2357
    }
2342 2358

	
2343 2359
    template <typename FW, typename BK>
2344 2360
    static CombinedArcMap<FW, const BK>
2345 2361
    combinedArcMap(FW& forward, const BK& backward) {
2346 2362
      return CombinedArcMap<FW, const BK>(forward, backward);
2347 2363
    }
2348 2364

	
2349 2365
    template <typename FW, typename BK>
2350 2366
    static CombinedArcMap<const FW, const BK>
2351 2367
    combinedArcMap(const FW& forward, const BK& backward) {
2352 2368
      return CombinedArcMap<const FW, const BK>(forward, backward);
2353 2369
    }
2354 2370

	
2355 2371
  };
2356 2372

	
2357 2373
  /// \brief Returns a read-only Undirector adaptor
2358 2374
  ///
2359 2375
  /// This function just returns a read-only \ref Undirector adaptor.
2360 2376
  /// \ingroup graph_adaptors
2361 2377
  /// \relates Undirector
2362 2378
  template<typename DGR>
2363 2379
  Undirector<const DGR> undirector(const DGR& digraph) {
2364 2380
    return Undirector<const DGR>(digraph);
2365 2381
  }
2366 2382

	
2367 2383

	
2368 2384
  template <typename GR, typename DM>
2369 2385
  class OrienterBase {
2370 2386
  public:
2371 2387

	
2372 2388
    typedef GR Graph;
2373 2389
    typedef DM DirectionMap;
2374 2390

	
2375 2391
    typedef typename GR::Node Node;
2376 2392
    typedef typename GR::Edge Arc;
2377 2393

	
2378 2394
    void reverseArc(const Arc& arc) {
2379 2395
      _direction->set(arc, !(*_direction)[arc]);
2380 2396
    }
2381 2397

	
2382 2398
    void first(Node& i) const { _graph->first(i); }
2383 2399
    void first(Arc& i) const { _graph->first(i); }
2384 2400
    void firstIn(Arc& i, const Node& n) const {
2385 2401
      bool d = true;
2386 2402
      _graph->firstInc(i, d, n);
2387 2403
      while (i != INVALID && d == (*_direction)[i]) _graph->nextInc(i, d);
2388 2404
    }
2389 2405
    void firstOut(Arc& i, const Node& n ) const {
2390 2406
      bool d = true;
2391 2407
      _graph->firstInc(i, d, n);
2392 2408
      while (i != INVALID && d != (*_direction)[i]) _graph->nextInc(i, d);
2393 2409
    }
2394 2410

	
2395 2411
    void next(Node& i) const { _graph->next(i); }
2396 2412
    void next(Arc& i) const { _graph->next(i); }
2397 2413
    void nextIn(Arc& i) const {
2398 2414
      bool d = !(*_direction)[i];
2399 2415
      _graph->nextInc(i, d);
2400 2416
      while (i != INVALID && d == (*_direction)[i]) _graph->nextInc(i, d);
2401 2417
    }
2402 2418
    void nextOut(Arc& i) const {
2403 2419
      bool d = (*_direction)[i];
2404 2420
      _graph->nextInc(i, d);
2405 2421
      while (i != INVALID && d != (*_direction)[i]) _graph->nextInc(i, d);
2406 2422
    }
2407 2423

	
2408 2424
    Node source(const Arc& e) const {
2409 2425
      return (*_direction)[e] ? _graph->u(e) : _graph->v(e);
2410 2426
    }
2411 2427
    Node target(const Arc& e) const {
2412 2428
      return (*_direction)[e] ? _graph->v(e) : _graph->u(e);
2413 2429
    }
2414 2430

	
2415 2431
    typedef NodeNumTagIndicator<Graph> NodeNumTag;
2416 2432
    int nodeNum() const { return _graph->nodeNum(); }
2417 2433

	
2418 2434
    typedef EdgeNumTagIndicator<Graph> ArcNumTag;
2419 2435
    int arcNum() const { return _graph->edgeNum(); }
2420 2436

	
2421 2437
    typedef FindEdgeTagIndicator<Graph> FindArcTag;
2422 2438
    Arc findArc(const Node& u, const Node& v,
2423 2439
                const Arc& prev = INVALID) const {
2424 2440
      Arc arc = _graph->findEdge(u, v, prev);
2425 2441
      while (arc != INVALID && source(arc) != u) {
2426 2442
        arc = _graph->findEdge(u, v, arc);
2427 2443
      }
2428 2444
      return arc;
2429 2445
    }
2430 2446

	
2431 2447
    Node addNode() {
2432 2448
      return Node(_graph->addNode());
2433 2449
    }
2434 2450

	
2435 2451
    Arc addArc(const Node& u, const Node& v) {
2436 2452
      Arc arc = _graph->addEdge(u, v);
2437 2453
      _direction->set(arc, _graph->u(arc) == u);
2438 2454
      return arc;
2439 2455
    }
2440 2456

	
2441 2457
    void erase(const Node& i) { _graph->erase(i); }
2442 2458
    void erase(const Arc& i) { _graph->erase(i); }
2443 2459

	
2444 2460
    void clear() { _graph->clear(); }
2445 2461

	
2446 2462
    int id(const Node& v) const { return _graph->id(v); }
2447 2463
    int id(const Arc& e) const { return _graph->id(e); }
2448 2464

	
2449 2465
    Node nodeFromId(int idx) const { return _graph->nodeFromId(idx); }
2450 2466
    Arc arcFromId(int idx) const { return _graph->edgeFromId(idx); }
2451 2467

	
2452 2468
    int maxNodeId() const { return _graph->maxNodeId(); }
2453 2469
    int maxArcId() const { return _graph->maxEdgeId(); }
2454 2470

	
2455 2471
    typedef typename ItemSetTraits<GR, Node>::ItemNotifier NodeNotifier;
2456 2472
    NodeNotifier& notifier(Node) const { return _graph->notifier(Node()); }
2457 2473

	
2458 2474
    typedef typename ItemSetTraits<GR, Arc>::ItemNotifier ArcNotifier;
2459 2475
    ArcNotifier& notifier(Arc) const { return _graph->notifier(Arc()); }
2460 2476

	
2461 2477
    template <typename V>
2462 2478
    class NodeMap : public GR::template NodeMap<V> {
2463 2479
      typedef typename GR::template NodeMap<V> Parent;
2464 2480

	
2465 2481
    public:
2466 2482

	
2467 2483
      explicit NodeMap(const OrienterBase<GR, DM>& adapter)
2468 2484
        : Parent(*adapter._graph) {}
2469 2485

	
2470 2486
      NodeMap(const OrienterBase<GR, DM>& adapter, const V& value)
2471 2487
        : Parent(*adapter._graph, value) {}
2472 2488

	
2473 2489
    private:
2474 2490
      NodeMap& operator=(const NodeMap& cmap) {
2475 2491
        return operator=<NodeMap>(cmap);
2476 2492
      }
2477 2493

	
2478 2494
      template <typename CMap>
2479 2495
      NodeMap& operator=(const CMap& cmap) {
2480 2496
        Parent::operator=(cmap);
2481 2497
        return *this;
2482 2498
      }
2483 2499

	
2484 2500
    };
2485 2501

	
2486 2502
    template <typename V>
2487 2503
    class ArcMap : public GR::template EdgeMap<V> {
2488 2504
      typedef typename Graph::template EdgeMap<V> Parent;
2489 2505

	
2490 2506
    public:
2491 2507

	
2492 2508
      explicit ArcMap(const OrienterBase<GR, DM>& adapter)
2493 2509
        : Parent(*adapter._graph) { }
2494 2510

	
2495 2511
      ArcMap(const OrienterBase<GR, DM>& adapter, const V& value)
2496 2512
        : Parent(*adapter._graph, value) { }
2497 2513

	
2498 2514
    private:
2499 2515
      ArcMap& operator=(const ArcMap& cmap) {
2500 2516
        return operator=<ArcMap>(cmap);
2501 2517
      }
2502 2518

	
2503 2519
      template <typename CMap>
2504 2520
      ArcMap& operator=(const CMap& cmap) {
2505 2521
        Parent::operator=(cmap);
2506 2522
        return *this;
2507 2523
      }
2508 2524
    };
2509 2525

	
2510 2526

	
2511 2527

	
2512 2528
  protected:
2513 2529
    Graph* _graph;
2514 2530
    DM* _direction;
2515 2531

	
2516 2532
    void initialize(GR& graph, DM& direction) {
2517 2533
      _graph = &graph;
2518 2534
      _direction = &direction;
2519 2535
    }
2520 2536

	
2521 2537
  };
2522 2538

	
2523 2539
  /// \ingroup graph_adaptors
2524 2540
  ///
2525 2541
  /// \brief Adaptor class for orienting the edges of a graph to get a digraph
2526 2542
  ///
2527 2543
  /// Orienter adaptor can be used for orienting the edges of a graph to
2528 2544
  /// get a digraph. A \c bool edge map of the underlying graph must be
2529 2545
  /// specified, which define the direction of the arcs in the adaptor.
2530 2546
  /// The arcs can be easily reversed by the \c reverseArc() member function
2531 2547
  /// of the adaptor.
2532 2548
  /// This class conforms to the \ref concepts::Digraph "Digraph" concept.
2533 2549
  ///
2534 2550
  /// The adapted graph can also be modified through this adaptor
2535 2551
  /// by adding or removing nodes or arcs, unless the \c GR template
2536 2552
  /// parameter is set to be \c const.
2537 2553
  ///
2554
  /// This class provides item counting in the same time as the adapted
2555
  /// graph structure.
2556
  ///
2538 2557
  /// \tparam GR The type of the adapted graph.
2539 2558
  /// It must conform to the \ref concepts::Graph "Graph" concept.
2540 2559
  /// It can also be specified to be \c const.
2541 2560
  /// \tparam DM The type of the direction map.
2542 2561
  /// It must be a \c bool (or convertible) edge map of the
2543 2562
  /// adapted graph. The default type is
2544 2563
  /// \ref concepts::Graph::EdgeMap "GR::EdgeMap<bool>".
2545 2564
  ///
2546 2565
  /// \note The \c Node type of this adaptor and the adapted graph are
2547 2566
  /// convertible to each other, moreover the \c Arc type of the adaptor
2548 2567
  /// and the \c Edge type of the adapted graph are also convertible to
2549 2568
  /// each other.
2550 2569
#ifdef DOXYGEN
2551 2570
  template<typename GR,
2552 2571
           typename DM>
2553 2572
  class Orienter {
2554 2573
#else
2555 2574
  template<typename GR,
2556 2575
           typename DM = typename GR::template EdgeMap<bool> >
2557 2576
  class Orienter :
2558 2577
    public DigraphAdaptorExtender<OrienterBase<GR, DM> > {
2559 2578
#endif
2560 2579
    typedef DigraphAdaptorExtender<OrienterBase<GR, DM> > Parent;
2561 2580
  public:
2562 2581

	
2563 2582
    /// The type of the adapted graph.
2564 2583
    typedef GR Graph;
2565 2584
    /// The type of the direction edge map.
2566 2585
    typedef DM DirectionMap;
2567 2586

	
2568 2587
    typedef typename Parent::Arc Arc;
2569 2588

	
2570 2589
  protected:
2571 2590
    Orienter() { }
2572 2591

	
2573 2592
  public:
2574 2593

	
2575 2594
    /// \brief Constructor
2576 2595
    ///
2577 2596
    /// Constructor of the adaptor.
2578 2597
    Orienter(GR& graph, DM& direction) {
2579 2598
      Parent::initialize(graph, direction);
2580 2599
    }
2581 2600

	
2582 2601
    /// \brief Reverses the given arc
2583 2602
    ///
2584 2603
    /// This function reverses the given arc.
2585 2604
    /// It is done by simply negate the assigned value of \c a
2586 2605
    /// in the direction map.
2587 2606
    void reverseArc(const Arc& a) {
2588 2607
      Parent::reverseArc(a);
2589 2608
    }
2590 2609
  };
2591 2610

	
2592 2611
  /// \brief Returns a read-only Orienter adaptor
2593 2612
  ///
2594 2613
  /// This function just returns a read-only \ref Orienter adaptor.
2595 2614
  /// \ingroup graph_adaptors
2596 2615
  /// \relates Orienter
2597 2616
  template<typename GR, typename DM>
2598 2617
  Orienter<const GR, DM>
2599 2618
  orienter(const GR& graph, DM& direction) {
2600 2619
    return Orienter<const GR, DM>(graph, direction);
2601 2620
  }
2602 2621

	
2603 2622
  template<typename GR, typename DM>
2604 2623
  Orienter<const GR, const DM>
2605 2624
  orienter(const GR& graph, const DM& direction) {
2606 2625
    return Orienter<const GR, const DM>(graph, direction);
2607 2626
  }
2608 2627

	
2609 2628
  namespace _adaptor_bits {
2610 2629

	
2611 2630
    template <typename DGR, typename CM, typename FM, typename TL>
2612 2631
    class ResForwardFilter {
2613 2632
    public:
2614 2633

	
2615 2634
      typedef typename DGR::Arc Key;
2616 2635
      typedef bool Value;
2617 2636

	
2618 2637
    private:
2619 2638

	
2620 2639
      const CM* _capacity;
2621 2640
      const FM* _flow;
2622 2641
      TL _tolerance;
2623 2642

	
2624 2643
    public:
2625 2644

	
2626 2645
      ResForwardFilter(const CM& capacity, const FM& flow,
2627 2646
                       const TL& tolerance = TL())
2628 2647
        : _capacity(&capacity), _flow(&flow), _tolerance(tolerance) { }
2629 2648

	
2630 2649
      bool operator[](const typename DGR::Arc& a) const {
2631 2650
        return _tolerance.positive((*_capacity)[a] - (*_flow)[a]);
2632 2651
      }
2633 2652
    };
2634 2653

	
2635 2654
    template<typename DGR,typename CM, typename FM, typename TL>
2636 2655
    class ResBackwardFilter {
2637 2656
    public:
2638 2657

	
2639 2658
      typedef typename DGR::Arc Key;
2640 2659
      typedef bool Value;
2641 2660

	
2642 2661
    private:
2643 2662

	
2644 2663
      const CM* _capacity;
2645 2664
      const FM* _flow;
2646 2665
      TL _tolerance;
2647 2666

	
2648 2667
    public:
2649 2668

	
2650 2669
      ResBackwardFilter(const CM& capacity, const FM& flow,
2651 2670
                        const TL& tolerance = TL())
2652 2671
        : _capacity(&capacity), _flow(&flow), _tolerance(tolerance) { }
2653 2672

	
2654 2673
      bool operator[](const typename DGR::Arc& a) const {
2655 2674
        return _tolerance.positive((*_flow)[a]);
2656 2675
      }
2657 2676
    };
2658 2677

	
2659 2678
  }
2660 2679

	
2661 2680
  /// \ingroup graph_adaptors
2662 2681
  ///
2663 2682
  /// \brief Adaptor class for composing the residual digraph for directed
2664 2683
  /// flow and circulation problems.
2665 2684
  ///
2666 2685
  /// ResidualDigraph can be used for composing the \e residual digraph
2667 2686
  /// for directed flow and circulation problems. Let \f$ G=(V, A) \f$
2668 2687
  /// be a directed graph and let \f$ F \f$ be a number type.
2669 2688
  /// Let \f$ flow, cap: A\to F \f$ be functions on the arcs.
2670 2689
  /// This adaptor implements a digraph structure with node set \f$ V \f$
2671 2690
  /// and arc set \f$ A_{forward}\cup A_{backward} \f$,
2672 2691
  /// where \f$ A_{forward}=\{uv : uv\in A, flow(uv)<cap(uv)\} \f$ and
2673 2692
  /// \f$ A_{backward}=\{vu : uv\in A, flow(uv)>0\} \f$, i.e. the so
2674 2693
  /// called residual digraph.
2675 2694
  /// When the union \f$ A_{forward}\cup A_{backward} \f$ is taken,
2676 2695
  /// multiplicities are counted, i.e. the adaptor has exactly
2677 2696
  /// \f$ |A_{forward}| + |A_{backward}|\f$ arcs (it may have parallel
2678 2697
  /// arcs).
2679 2698
  /// This class conforms to the \ref concepts::Digraph "Digraph" concept.
2680 2699
  ///
2700
  /// This class provides only linear time counting for nodes and arcs.
2701
  ///
2681 2702
  /// \tparam DGR The type of the adapted digraph.
2682 2703
  /// It must conform to the \ref concepts::Digraph "Digraph" concept.
2683 2704
  /// It is implicitly \c const.
2684 2705
  /// \tparam CM The type of the capacity map.
2685 2706
  /// It must be an arc map of some numerical type, which defines
2686 2707
  /// the capacities in the flow problem. It is implicitly \c const.
2687 2708
  /// The default type is
2688 2709
  /// \ref concepts::Digraph::ArcMap "GR::ArcMap<int>".
2689 2710
  /// \tparam FM The type of the flow map.
2690 2711
  /// It must be an arc map of some numerical type, which defines
2691 2712
  /// the flow values in the flow problem. The default type is \c CM.
2692 2713
  /// \tparam TL The tolerance type for handling inexact computation.
2693 2714
  /// The default tolerance type depends on the value type of the
2694 2715
  /// capacity map.
2695 2716
  ///
2696 2717
  /// \note This adaptor is implemented using Undirector and FilterArcs
2697 2718
  /// adaptors.
2698 2719
  ///
2699 2720
  /// \note The \c Node type of this adaptor and the adapted digraph are
2700 2721
  /// convertible to each other, moreover the \c Arc type of the adaptor
2701 2722
  /// is convertible to the \c Arc type of the adapted digraph.
2702 2723
#ifdef DOXYGEN
2703 2724
  template<typename DGR, typename CM, typename FM, typename TL>
2704 2725
  class ResidualDigraph
2705 2726
#else
2706 2727
  template<typename DGR,
2707 2728
           typename CM = typename DGR::template ArcMap<int>,
2708 2729
           typename FM = CM,
2709 2730
           typename TL = Tolerance<typename CM::Value> >
2710 2731
  class ResidualDigraph 
2711 2732
    : public SubDigraph<
2712 2733
        Undirector<const DGR>,
2713 2734
        ConstMap<typename DGR::Node, Const<bool, true> >,
2714 2735
        typename Undirector<const DGR>::template CombinedArcMap<
2715 2736
          _adaptor_bits::ResForwardFilter<const DGR, CM, FM, TL>,
2716 2737
          _adaptor_bits::ResBackwardFilter<const DGR, CM, FM, TL> > >
2717 2738
#endif
2718 2739
  {
2719 2740
  public:
2720 2741

	
2721 2742
    /// The type of the underlying digraph.
2722 2743
    typedef DGR Digraph;
2723 2744
    /// The type of the capacity map.
2724 2745
    typedef CM CapacityMap;
2725 2746
    /// The type of the flow map.
2726 2747
    typedef FM FlowMap;
2727 2748
    /// The tolerance type.
2728 2749
    typedef TL Tolerance;
2729 2750

	
2730 2751
    typedef typename CapacityMap::Value Value;
2731 2752
    typedef ResidualDigraph Adaptor;
2732 2753

	
2733 2754
  protected:
2734 2755

	
2735 2756
    typedef Undirector<const Digraph> Undirected;
2736 2757

	
2737 2758
    typedef ConstMap<typename DGR::Node, Const<bool, true> > NodeFilter;
2738 2759

	
2739 2760
    typedef _adaptor_bits::ResForwardFilter<const DGR, CM,
2740 2761
                                            FM, TL> ForwardFilter;
2741 2762

	
2742 2763
    typedef _adaptor_bits::ResBackwardFilter<const DGR, CM,
2743 2764
                                             FM, TL> BackwardFilter;
2744 2765

	
2745 2766
    typedef typename Undirected::
2746 2767
      template CombinedArcMap<ForwardFilter, BackwardFilter> ArcFilter;
2747 2768

	
2748 2769
    typedef SubDigraph<Undirected, NodeFilter, ArcFilter> Parent;
2749 2770

	
2750 2771
    const CapacityMap* _capacity;
2751 2772
    FlowMap* _flow;
2752 2773

	
2753 2774
    Undirected _graph;
2754 2775
    NodeFilter _node_filter;
2755 2776
    ForwardFilter _forward_filter;
2756 2777
    BackwardFilter _backward_filter;
2757 2778
    ArcFilter _arc_filter;
2758 2779

	
2759 2780
  public:
2760 2781

	
2761 2782
    /// \brief Constructor
2762 2783
    ///
2763 2784
    /// Constructor of the residual digraph adaptor. The parameters are the
2764 2785
    /// digraph, the capacity map, the flow map, and a tolerance object.
2765 2786
    ResidualDigraph(const DGR& digraph, const CM& capacity,
2766 2787
                    FM& flow, const TL& tolerance = Tolerance())
2767 2788
      : Parent(), _capacity(&capacity), _flow(&flow), 
2768 2789
        _graph(digraph), _node_filter(),
2769 2790
        _forward_filter(capacity, flow, tolerance),
2770 2791
        _backward_filter(capacity, flow, tolerance),
2771 2792
        _arc_filter(_forward_filter, _backward_filter)
2772 2793
    {
2773 2794
      Parent::initialize(_graph, _node_filter, _arc_filter);
2774 2795
    }
2775 2796

	
2776 2797
    typedef typename Parent::Arc Arc;
2777 2798

	
2778 2799
    /// \brief Returns the residual capacity of the given arc.
2779 2800
    ///
2780 2801
    /// Returns the residual capacity of the given arc.
2781 2802
    Value residualCapacity(const Arc& a) const {
2782 2803
      if (Undirected::direction(a)) {
2783 2804
        return (*_capacity)[a] - (*_flow)[a];
2784 2805
      } else {
2785 2806
        return (*_flow)[a];
2786 2807
      }
2787 2808
    }
2788 2809

	
2789 2810
    /// \brief Augments on the given arc in the residual digraph.
2790 2811
    ///
2791 2812
    /// Augments on the given arc in the residual digraph. It increases
2792 2813
    /// or decreases the flow value on the original arc according to the
2793 2814
    /// direction of the residual arc.
2794 2815
    void augment(const Arc& a, const Value& v) const {
2795 2816
      if (Undirected::direction(a)) {
2796 2817
        _flow->set(a, (*_flow)[a] + v);
2797 2818
      } else {
2798 2819
        _flow->set(a, (*_flow)[a] - v);
2799 2820
      }
2800 2821
    }
2801 2822

	
2802 2823
    /// \brief Returns \c true if the given residual arc is a forward arc.
2803 2824
    ///
2804 2825
    /// Returns \c true if the given residual arc has the same orientation
2805 2826
    /// as the original arc, i.e. it is a so called forward arc.
2806 2827
    static bool forward(const Arc& a) {
2807 2828
      return Undirected::direction(a);
2808 2829
    }
2809 2830

	
2810 2831
    /// \brief Returns \c true if the given residual arc is a backward arc.
2811 2832
    ///
2812 2833
    /// Returns \c true if the given residual arc has the opposite orientation
2813 2834
    /// than the original arc, i.e. it is a so called backward arc.
2814 2835
    static bool backward(const Arc& a) {
2815 2836
      return !Undirected::direction(a);
2816 2837
    }
2817 2838

	
2818 2839
    /// \brief Returns the forward oriented residual arc.
2819 2840
    ///
2820 2841
    /// Returns the forward oriented residual arc related to the given
2821 2842
    /// arc of the underlying digraph.
2822 2843
    static Arc forward(const typename Digraph::Arc& a) {
2823 2844
      return Undirected::direct(a, true);
2824 2845
    }
2825 2846

	
2826 2847
    /// \brief Returns the backward oriented residual arc.
2827 2848
    ///
2828 2849
    /// Returns the backward oriented residual arc related to the given
2829 2850
    /// arc of the underlying digraph.
2830 2851
    static Arc backward(const typename Digraph::Arc& a) {
2831 2852
      return Undirected::direct(a, false);
2832 2853
    }
2833 2854

	
2834 2855
    /// \brief Residual capacity map.
2835 2856
    ///
2836 2857
    /// This map adaptor class can be used for obtaining the residual
2837 2858
    /// capacities as an arc map of the residual digraph.
2838 2859
    /// Its value type is inherited from the capacity map.
2839 2860
    class ResidualCapacity {
2840 2861
    protected:
2841 2862
      const Adaptor* _adaptor;
2842 2863
    public:
2843 2864
      /// The key type of the map
2844 2865
      typedef Arc Key;
2845 2866
      /// The value type of the map
2846 2867
      typedef typename CapacityMap::Value Value;
2847 2868

	
2848 2869
      /// Constructor
2849 2870
      ResidualCapacity(const ResidualDigraph<DGR, CM, FM, TL>& adaptor) 
2850 2871
        : _adaptor(&adaptor) {}
2851 2872

	
2852 2873
      /// Returns the value associated with the given residual arc
2853 2874
      Value operator[](const Arc& a) const {
2854 2875
        return _adaptor->residualCapacity(a);
2855 2876
      }
2856 2877

	
2857 2878
    };
2858 2879

	
2859 2880
    /// \brief Returns a residual capacity map
2860 2881
    ///
2861 2882
    /// This function just returns a residual capacity map.
2862 2883
    ResidualCapacity residualCapacity() const {
2863 2884
      return ResidualCapacity(*this);
2864 2885
    }
2865 2886

	
2866 2887
  };
2867 2888

	
2868 2889
  /// \brief Returns a (read-only) Residual adaptor
2869 2890
  ///
2870 2891
  /// This function just returns a (read-only) \ref ResidualDigraph adaptor.
2871 2892
  /// \ingroup graph_adaptors
2872 2893
  /// \relates ResidualDigraph
2873 2894
    template<typename DGR, typename CM, typename FM>
2874 2895
  ResidualDigraph<DGR, CM, FM>
2875 2896
  residualDigraph(const DGR& digraph, const CM& capacity_map, FM& flow_map) {
2876 2897
    return ResidualDigraph<DGR, CM, FM> (digraph, capacity_map, flow_map);
2877 2898
  }
2878 2899

	
2879 2900

	
2880 2901
  template <typename DGR>
2881 2902
  class SplitNodesBase {
2882 2903
    typedef DigraphAdaptorBase<const DGR> Parent;
2883 2904

	
2884 2905
  public:
2885 2906

	
2886 2907
    typedef DGR Digraph;
2887 2908
    typedef SplitNodesBase Adaptor;
2888 2909

	
2889 2910
    typedef typename DGR::Node DigraphNode;
2890 2911
    typedef typename DGR::Arc DigraphArc;
2891 2912

	
2892 2913
    class Node;
2893 2914
    class Arc;
2894 2915

	
2895 2916
  private:
2896 2917

	
2897 2918
    template <typename T> class NodeMapBase;
2898 2919
    template <typename T> class ArcMapBase;
2899 2920

	
2900 2921
  public:
2901 2922

	
2902 2923
    class Node : public DigraphNode {
2903 2924
      friend class SplitNodesBase;
2904 2925
      template <typename T> friend class NodeMapBase;
2905 2926
    private:
2906 2927

	
2907 2928
      bool _in;
2908 2929
      Node(DigraphNode node, bool in)
2909 2930
        : DigraphNode(node), _in(in) {}
2910 2931

	
2911 2932
    public:
2912 2933

	
2913 2934
      Node() {}
2914 2935
      Node(Invalid) : DigraphNode(INVALID), _in(true) {}
2915 2936

	
2916 2937
      bool operator==(const Node& node) const {
2917 2938
        return DigraphNode::operator==(node) && _in == node._in;
2918 2939
      }
2919 2940

	
2920 2941
      bool operator!=(const Node& node) const {
2921 2942
        return !(*this == node);
2922 2943
      }
2923 2944

	
2924 2945
      bool operator<(const Node& node) const {
2925 2946
        return DigraphNode::operator<(node) ||
2926 2947
          (DigraphNode::operator==(node) && _in < node._in);
2927 2948
      }
2928 2949
    };
2929 2950

	
2930 2951
    class Arc {
2931 2952
      friend class SplitNodesBase;
2932 2953
      template <typename T> friend class ArcMapBase;
2933 2954
    private:
2934 2955
      typedef BiVariant<DigraphArc, DigraphNode> ArcImpl;
2935 2956

	
2936 2957
      explicit Arc(const DigraphArc& arc) : _item(arc) {}
2937 2958
      explicit Arc(const DigraphNode& node) : _item(node) {}
2938 2959

	
2939 2960
      ArcImpl _item;
2940 2961

	
2941 2962
    public:
2942 2963
      Arc() {}
2943 2964
      Arc(Invalid) : _item(DigraphArc(INVALID)) {}
2944 2965

	
2945 2966
      bool operator==(const Arc& arc) const {
2946 2967
        if (_item.firstState()) {
2947 2968
          if (arc._item.firstState()) {
2948 2969
            return _item.first() == arc._item.first();
2949 2970
          }
2950 2971
        } else {
2951 2972
          if (arc._item.secondState()) {
2952 2973
            return _item.second() == arc._item.second();
2953 2974
          }
2954 2975
        }
2955 2976
        return false;
2956 2977
      }
2957 2978

	
2958 2979
      bool operator!=(const Arc& arc) const {
2959 2980
        return !(*this == arc);
2960 2981
      }
2961 2982

	
2962 2983
      bool operator<(const Arc& arc) const {
2963 2984
        if (_item.firstState()) {
2964 2985
          if (arc._item.firstState()) {
2965 2986
            return _item.first() < arc._item.first();
2966 2987
          }
2967 2988
          return false;
2968 2989
        } else {
2969 2990
          if (arc._item.secondState()) {
2970 2991
            return _item.second() < arc._item.second();
2971 2992
          }
2972 2993
          return true;
2973 2994
        }
2974 2995
      }
2975 2996

	
2976 2997
      operator DigraphArc() const { return _item.first(); }
2977 2998
      operator DigraphNode() const { return _item.second(); }
2978 2999

	
2979 3000
    };
2980 3001

	
2981 3002
    void first(Node& n) const {
2982 3003
      _digraph->first(n);
2983 3004
      n._in = true;
2984 3005
    }
2985 3006

	
2986 3007
    void next(Node& n) const {
2987 3008
      if (n._in) {
2988 3009
        n._in = false;
2989 3010
      } else {
2990 3011
        n._in = true;
2991 3012
        _digraph->next(n);
2992 3013
      }
2993 3014
    }
2994 3015

	
2995 3016
    void first(Arc& e) const {
2996 3017
      e._item.setSecond();
2997 3018
      _digraph->first(e._item.second());
2998 3019
      if (e._item.second() == INVALID) {
2999 3020
        e._item.setFirst();
3000 3021
        _digraph->first(e._item.first());
3001 3022
      }
3002 3023
    }
3003 3024

	
3004 3025
    void next(Arc& e) const {
3005 3026
      if (e._item.secondState()) {
3006 3027
        _digraph->next(e._item.second());
3007 3028
        if (e._item.second() == INVALID) {
3008 3029
          e._item.setFirst();
3009 3030
          _digraph->first(e._item.first());
3010 3031
        }
3011 3032
      } else {
3012 3033
        _digraph->next(e._item.first());
3013 3034
      }
3014 3035
    }
3015 3036

	
3016 3037
    void firstOut(Arc& e, const Node& n) const {
3017 3038
      if (n._in) {
3018 3039
        e._item.setSecond(n);
3019 3040
      } else {
3020 3041
        e._item.setFirst();
3021 3042
        _digraph->firstOut(e._item.first(), n);
3022 3043
      }
3023 3044
    }
3024 3045

	
3025 3046
    void nextOut(Arc& e) const {
3026 3047
      if (!e._item.firstState()) {
3027 3048
        e._item.setFirst(INVALID);
3028 3049
      } else {
3029 3050
        _digraph->nextOut(e._item.first());
3030 3051
      }
3031 3052
    }
3032 3053

	
3033 3054
    void firstIn(Arc& e, const Node& n) const {
3034 3055
      if (!n._in) {
3035 3056
        e._item.setSecond(n);
3036 3057
      } else {
3037 3058
        e._item.setFirst();
3038 3059
        _digraph->firstIn(e._item.first(), n);
3039 3060
      }
3040 3061
    }
3041 3062

	
3042 3063
    void nextIn(Arc& e) const {
3043 3064
      if (!e._item.firstState()) {
3044 3065
        e._item.setFirst(INVALID);
3045 3066
      } else {
3046 3067
        _digraph->nextIn(e._item.first());
3047 3068
      }
3048 3069
    }
3049 3070

	
3050 3071
    Node source(const Arc& e) const {
3051 3072
      if (e._item.firstState()) {
3052 3073
        return Node(_digraph->source(e._item.first()), false);
3053 3074
      } else {
3054 3075
        return Node(e._item.second(), true);
3055 3076
      }
3056 3077
    }
3057 3078

	
3058 3079
    Node target(const Arc& e) const {
3059 3080
      if (e._item.firstState()) {
3060 3081
        return Node(_digraph->target(e._item.first()), true);
3061 3082
      } else {
3062 3083
        return Node(e._item.second(), false);
3063 3084
      }
3064 3085
    }
3065 3086

	
3066 3087
    int id(const Node& n) const {
3067 3088
      return (_digraph->id(n) << 1) | (n._in ? 0 : 1);
3068 3089
    }
3069 3090
    Node nodeFromId(int ix) const {
3070 3091
      return Node(_digraph->nodeFromId(ix >> 1), (ix & 1) == 0);
3071 3092
    }
3072 3093
    int maxNodeId() const {
3073 3094
      return 2 * _digraph->maxNodeId() + 1;
3074 3095
    }
3075 3096

	
3076 3097
    int id(const Arc& e) const {
3077 3098
      if (e._item.firstState()) {
3078 3099
        return _digraph->id(e._item.first()) << 1;
3079 3100
      } else {
3080 3101
        return (_digraph->id(e._item.second()) << 1) | 1;
3081 3102
      }
3082 3103
    }
3083 3104
    Arc arcFromId(int ix) const {
3084 3105
      if ((ix & 1) == 0) {
3085 3106
        return Arc(_digraph->arcFromId(ix >> 1));
3086 3107
      } else {
3087 3108
        return Arc(_digraph->nodeFromId(ix >> 1));
3088 3109
      }
3089 3110
    }
3090 3111
    int maxArcId() const {
3091 3112
      return std::max(_digraph->maxNodeId() << 1,
3092 3113
                      (_digraph->maxArcId() << 1) | 1);
3093 3114
    }
3094 3115

	
3095 3116
    static bool inNode(const Node& n) {
3096 3117
      return n._in;
3097 3118
    }
3098 3119

	
3099 3120
    static bool outNode(const Node& n) {
3100 3121
      return !n._in;
3101 3122
    }
3102 3123

	
3103 3124
    static bool origArc(const Arc& e) {
3104 3125
      return e._item.firstState();
3105 3126
    }
3106 3127

	
3107 3128
    static bool bindArc(const Arc& e) {
3108 3129
      return e._item.secondState();
3109 3130
    }
3110 3131

	
3111 3132
    static Node inNode(const DigraphNode& n) {
3112 3133
      return Node(n, true);
3113 3134
    }
3114 3135

	
3115 3136
    static Node outNode(const DigraphNode& n) {
3116 3137
      return Node(n, false);
3117 3138
    }
3118 3139

	
3119 3140
    static Arc arc(const DigraphNode& n) {
3120 3141
      return Arc(n);
3121 3142
    }
3122 3143

	
3123 3144
    static Arc arc(const DigraphArc& e) {
3124 3145
      return Arc(e);
3125 3146
    }
3126 3147

	
3127 3148
    typedef True NodeNumTag;
3128 3149
    int nodeNum() const {
3129 3150
      return  2 * countNodes(*_digraph);
3130 3151
    }
3131 3152

	
3132 3153
    typedef True ArcNumTag;
3133 3154
    int arcNum() const {
3134 3155
      return countArcs(*_digraph) + countNodes(*_digraph);
3135 3156
    }
3136 3157

	
3137 3158
    typedef True FindArcTag;
3138 3159
    Arc findArc(const Node& u, const Node& v,
3139 3160
                const Arc& prev = INVALID) const {
3140 3161
      if (inNode(u) && outNode(v)) {
3141 3162
        if (static_cast<const DigraphNode&>(u) ==
3142 3163
            static_cast<const DigraphNode&>(v) && prev == INVALID) {
3143 3164
          return Arc(u);
3144 3165
        }
3145 3166
      }
3146 3167
      else if (outNode(u) && inNode(v)) {
3147 3168
        return Arc(::lemon::findArc(*_digraph, u, v, prev));
3148 3169
      }
3149 3170
      return INVALID;
3150 3171
    }
3151 3172

	
3152 3173
  private:
3153 3174

	
3154 3175
    template <typename V>
3155 3176
    class NodeMapBase
3156 3177
      : public MapTraits<typename Parent::template NodeMap<V> > {
3157 3178
      typedef typename Parent::template NodeMap<V> NodeImpl;
3158 3179
    public:
3159 3180
      typedef Node Key;
3160 3181
      typedef V Value;
3161 3182
      typedef typename MapTraits<NodeImpl>::ReferenceMapTag ReferenceMapTag;
3162 3183
      typedef typename MapTraits<NodeImpl>::ReturnValue ReturnValue;
3163 3184
      typedef typename MapTraits<NodeImpl>::ConstReturnValue ConstReturnValue;
3164 3185
      typedef typename MapTraits<NodeImpl>::ReturnValue Reference;
3165 3186
      typedef typename MapTraits<NodeImpl>::ConstReturnValue ConstReference;
3166 3187

	
3167 3188
      NodeMapBase(const SplitNodesBase<DGR>& adaptor)
3168 3189
        : _in_map(*adaptor._digraph), _out_map(*adaptor._digraph) {}
3169 3190
      NodeMapBase(const SplitNodesBase<DGR>& adaptor, const V& value)
3170 3191
        : _in_map(*adaptor._digraph, value),
3171 3192
          _out_map(*adaptor._digraph, value) {}
3172 3193

	
3173 3194
      void set(const Node& key, const V& val) {
3174 3195
        if (SplitNodesBase<DGR>::inNode(key)) { _in_map.set(key, val); }
3175 3196
        else {_out_map.set(key, val); }
3176 3197
      }
3177 3198

	
3178 3199
      ReturnValue operator[](const Node& key) {
3179 3200
        if (SplitNodesBase<DGR>::inNode(key)) { return _in_map[key]; }
3180 3201
        else { return _out_map[key]; }
3181 3202
      }
3182 3203

	
3183 3204
      ConstReturnValue operator[](const Node& key) const {
3184 3205
        if (Adaptor::inNode(key)) { return _in_map[key]; }
3185 3206
        else { return _out_map[key]; }
3186 3207
      }
3187 3208

	
3188 3209
    private:
3189 3210
      NodeImpl _in_map, _out_map;
3190 3211
    };
3191 3212

	
3192 3213
    template <typename V>
3193 3214
    class ArcMapBase
3194 3215
      : public MapTraits<typename Parent::template ArcMap<V> > {
3195 3216
      typedef typename Parent::template ArcMap<V> ArcImpl;
3196 3217
      typedef typename Parent::template NodeMap<V> NodeImpl;
3197 3218
    public:
3198 3219
      typedef Arc Key;
3199 3220
      typedef V Value;
3200 3221
      typedef typename MapTraits<ArcImpl>::ReferenceMapTag ReferenceMapTag;
3201 3222
      typedef typename MapTraits<ArcImpl>::ReturnValue ReturnValue;
3202 3223
      typedef typename MapTraits<ArcImpl>::ConstReturnValue ConstReturnValue;
3203 3224
      typedef typename MapTraits<ArcImpl>::ReturnValue Reference;
3204 3225
      typedef typename MapTraits<ArcImpl>::ConstReturnValue ConstReference;
3205 3226

	
3206 3227
      ArcMapBase(const SplitNodesBase<DGR>& adaptor)
3207 3228
        : _arc_map(*adaptor._digraph), _node_map(*adaptor._digraph) {}
3208 3229
      ArcMapBase(const SplitNodesBase<DGR>& adaptor, const V& value)
3209 3230
        : _arc_map(*adaptor._digraph, value),
3210 3231
          _node_map(*adaptor._digraph, value) {}
3211 3232

	
3212 3233
      void set(const Arc& key, const V& val) {
3213 3234
        if (SplitNodesBase<DGR>::origArc(key)) {
3214 3235
          _arc_map.set(static_cast<const DigraphArc&>(key), val);
3215 3236
        } else {
3216 3237
          _node_map.set(static_cast<const DigraphNode&>(key), val);
3217 3238
        }
3218 3239
      }
3219 3240

	
3220 3241
      ReturnValue operator[](const Arc& key) {
3221 3242
        if (SplitNodesBase<DGR>::origArc(key)) {
3222 3243
          return _arc_map[static_cast<const DigraphArc&>(key)];
3223 3244
        } else {
3224 3245
          return _node_map[static_cast<const DigraphNode&>(key)];
3225 3246
        }
3226 3247
      }
3227 3248

	
3228 3249
      ConstReturnValue operator[](const Arc& key) const {
3229 3250
        if (SplitNodesBase<DGR>::origArc(key)) {
3230 3251
          return _arc_map[static_cast<const DigraphArc&>(key)];
3231 3252
        } else {
3232 3253
          return _node_map[static_cast<const DigraphNode&>(key)];
3233 3254
        }
3234 3255
      }
3235 3256

	
3236 3257
    private:
3237 3258
      ArcImpl _arc_map;
3238 3259
      NodeImpl _node_map;
3239 3260
    };
3240 3261

	
3241 3262
  public:
3242 3263

	
3243 3264
    template <typename V>
3244 3265
    class NodeMap
3245 3266
      : public SubMapExtender<SplitNodesBase<DGR>, NodeMapBase<V> > {
3246 3267
      typedef SubMapExtender<SplitNodesBase<DGR>, NodeMapBase<V> > Parent;
3247 3268

	
3248 3269
    public:
3249 3270
      typedef V Value;
3250 3271

	
3251 3272
      NodeMap(const SplitNodesBase<DGR>& adaptor)
3252 3273
        : Parent(adaptor) {}
3253 3274

	
3254 3275
      NodeMap(const SplitNodesBase<DGR>& adaptor, const V& value)
3255 3276
        : Parent(adaptor, value) {}
3256 3277

	
3257 3278
    private:
3258 3279
      NodeMap& operator=(const NodeMap& cmap) {
3259 3280
        return operator=<NodeMap>(cmap);
3260 3281
      }
3261 3282

	
3262 3283
      template <typename CMap>
3263 3284
      NodeMap& operator=(const CMap& cmap) {
3264 3285
        Parent::operator=(cmap);
3265 3286
        return *this;
3266 3287
      }
3267 3288
    };
3268 3289

	
3269 3290
    template <typename V>
3270 3291
    class ArcMap
3271 3292
      : public SubMapExtender<SplitNodesBase<DGR>, ArcMapBase<V> > {
3272 3293
      typedef SubMapExtender<SplitNodesBase<DGR>, ArcMapBase<V> > Parent;
3273 3294

	
3274 3295
    public:
3275 3296
      typedef V Value;
3276 3297

	
3277 3298
      ArcMap(const SplitNodesBase<DGR>& adaptor)
3278 3299
        : Parent(adaptor) {}
3279 3300

	
3280 3301
      ArcMap(const SplitNodesBase<DGR>& adaptor, const V& value)
3281 3302
        : Parent(adaptor, value) {}
3282 3303

	
3283 3304
    private:
3284 3305
      ArcMap& operator=(const ArcMap& cmap) {
3285 3306
        return operator=<ArcMap>(cmap);
3286 3307
      }
3287 3308

	
3288 3309
      template <typename CMap>
3289 3310
      ArcMap& operator=(const CMap& cmap) {
3290 3311
        Parent::operator=(cmap);
3291 3312
        return *this;
3292 3313
      }
3293 3314
    };
3294 3315

	
3295 3316
  protected:
3296 3317

	
3297 3318
    SplitNodesBase() : _digraph(0) {}
3298 3319

	
3299 3320
    DGR* _digraph;
3300 3321

	
3301 3322
    void initialize(Digraph& digraph) {
3302 3323
      _digraph = &digraph;
3303 3324
    }
3304 3325

	
3305 3326
  };
3306 3327

	
3307 3328
  /// \ingroup graph_adaptors
3308 3329
  ///
3309 3330
  /// \brief Adaptor class for splitting the nodes of a digraph.
3310 3331
  ///
3311 3332
  /// SplitNodes adaptor can be used for splitting each node into an
3312 3333
  /// \e in-node and an \e out-node in a digraph. Formaly, the adaptor
3313 3334
  /// replaces each node \f$ u \f$ in the digraph with two nodes,
3314 3335
  /// namely node \f$ u_{in} \f$ and node \f$ u_{out} \f$.
3315 3336
  /// If there is a \f$ (v, u) \f$ arc in the original digraph, then the
3316 3337
  /// new target of the arc will be \f$ u_{in} \f$ and similarly the
3317 3338
  /// source of each original \f$ (u, v) \f$ arc will be \f$ u_{out} \f$.
3318 3339
  /// The adaptor adds an additional \e bind \e arc from \f$ u_{in} \f$
3319 3340
  /// to \f$ u_{out} \f$ for each node \f$ u \f$ of the original digraph.
3320 3341
  ///
3321 3342
  /// The aim of this class is running an algorithm with respect to node
3322 3343
  /// costs or capacities if the algorithm considers only arc costs or
3323 3344
  /// capacities directly.
3324 3345
  /// In this case you can use \c SplitNodes adaptor, and set the node
3325 3346
  /// costs/capacities of the original digraph to the \e bind \e arcs
3326 3347
  /// in the adaptor.
3327 3348
  ///
3349
  /// This class provides item counting in the same time as the adapted
3350
  /// digraph structure.
3351
  ///
3328 3352
  /// \tparam DGR The type of the adapted digraph.
3329 3353
  /// It must conform to the \ref concepts::Digraph "Digraph" concept.
3330 3354
  /// It is implicitly \c const.
3331 3355
  ///
3332 3356
  /// \note The \c Node type of this adaptor is converible to the \c Node
3333 3357
  /// type of the adapted digraph.
3334 3358
  template <typename DGR>
3335 3359
#ifdef DOXYGEN
3336 3360
  class SplitNodes {
3337 3361
#else
3338 3362
  class SplitNodes
3339 3363
    : public DigraphAdaptorExtender<SplitNodesBase<const DGR> > {
3340 3364
#endif
3341 3365
    typedef DigraphAdaptorExtender<SplitNodesBase<const DGR> > Parent;
3342 3366

	
3343 3367
  public:
3344 3368
    typedef DGR Digraph;
3345 3369

	
3346 3370
    typedef typename DGR::Node DigraphNode;
3347 3371
    typedef typename DGR::Arc DigraphArc;
3348 3372

	
3349 3373
    typedef typename Parent::Node Node;
3350 3374
    typedef typename Parent::Arc Arc;
3351 3375

	
3352 3376
    /// \brief Constructor
3353 3377
    ///
3354 3378
    /// Constructor of the adaptor.
3355 3379
    SplitNodes(const DGR& g) {
3356 3380
      Parent::initialize(g);
3357 3381
    }
3358 3382

	
3359 3383
    /// \brief Returns \c true if the given node is an in-node.
3360 3384
    ///
3361 3385
    /// Returns \c true if the given node is an in-node.
3362 3386
    static bool inNode(const Node& n) {
3363 3387
      return Parent::inNode(n);
3364 3388
    }
3365 3389

	
3366 3390
    /// \brief Returns \c true if the given node is an out-node.
3367 3391
    ///
3368 3392
    /// Returns \c true if the given node is an out-node.
3369 3393
    static bool outNode(const Node& n) {
3370 3394
      return Parent::outNode(n);
3371 3395
    }
3372 3396

	
3373 3397
    /// \brief Returns \c true if the given arc is an original arc.
3374 3398
    ///
3375 3399
    /// Returns \c true if the given arc is one of the arcs in the
3376 3400
    /// original digraph.
3377 3401
    static bool origArc(const Arc& a) {
3378 3402
      return Parent::origArc(a);
3379 3403
    }
3380 3404

	
3381 3405
    /// \brief Returns \c true if the given arc is a bind arc.
3382 3406
    ///
3383 3407
    /// Returns \c true if the given arc is a bind arc, i.e. it connects
3384 3408
    /// an in-node and an out-node.
3385 3409
    static bool bindArc(const Arc& a) {
3386 3410
      return Parent::bindArc(a);
3387 3411
    }
3388 3412

	
3389 3413
    /// \brief Returns the in-node created from the given original node.
3390 3414
    ///
3391 3415
    /// Returns the in-node created from the given original node.
3392 3416
    static Node inNode(const DigraphNode& n) {
3393 3417
      return Parent::inNode(n);
3394 3418
    }
3395 3419

	
3396 3420
    /// \brief Returns the out-node created from the given original node.
3397 3421
    ///
3398 3422
    /// Returns the out-node created from the given original node.
3399 3423
    static Node outNode(const DigraphNode& n) {
3400 3424
      return Parent::outNode(n);
3401 3425
    }
3402 3426

	
3403 3427
    /// \brief Returns the bind arc that corresponds to the given
3404 3428
    /// original node.
3405 3429
    ///
3406 3430
    /// Returns the bind arc in the adaptor that corresponds to the given
3407 3431
    /// original node, i.e. the arc connecting the in-node and out-node
3408 3432
    /// of \c n.
3409 3433
    static Arc arc(const DigraphNode& n) {
3410 3434
      return Parent::arc(n);
3411 3435
    }
3412 3436

	
3413 3437
    /// \brief Returns the arc that corresponds to the given original arc.
3414 3438
    ///
3415 3439
    /// Returns the arc in the adaptor that corresponds to the given
3416 3440
    /// original arc.
3417 3441
    static Arc arc(const DigraphArc& a) {
3418 3442
      return Parent::arc(a);
3419 3443
    }
3420 3444

	
3421 3445
    /// \brief Node map combined from two original node maps
3422 3446
    ///
3423 3447
    /// This map adaptor class adapts two node maps of the original digraph
3424 3448
    /// to get a node map of the split digraph.
3425 3449
    /// Its value type is inherited from the first node map type (\c IN).
3426 3450
    /// \tparam IN The type of the node map for the in-nodes. 
3427 3451
    /// \tparam OUT The type of the node map for the out-nodes.
3428 3452
    template <typename IN, typename OUT>
3429 3453
    class CombinedNodeMap {
3430 3454
    public:
3431 3455

	
3432 3456
      /// The key type of the map
3433 3457
      typedef Node Key;
3434 3458
      /// The value type of the map
3435 3459
      typedef typename IN::Value Value;
3436 3460

	
3437 3461
      typedef typename MapTraits<IN>::ReferenceMapTag ReferenceMapTag;
3438 3462
      typedef typename MapTraits<IN>::ReturnValue ReturnValue;
3439 3463
      typedef typename MapTraits<IN>::ConstReturnValue ConstReturnValue;
3440 3464
      typedef typename MapTraits<IN>::ReturnValue Reference;
3441 3465
      typedef typename MapTraits<IN>::ConstReturnValue ConstReference;
3442 3466

	
3443 3467
      /// Constructor
3444 3468
      CombinedNodeMap(IN& in_map, OUT& out_map)
3445 3469
        : _in_map(in_map), _out_map(out_map) {}
3446 3470

	
3447 3471
      /// Returns the value associated with the given key.
3448 3472
      Value operator[](const Key& key) const {
3449 3473
        if (SplitNodesBase<const DGR>::inNode(key)) {
3450 3474
          return _in_map[key];
3451 3475
        } else {
3452 3476
          return _out_map[key];
3453 3477
        }
3454 3478
      }
3455 3479

	
3456 3480
      /// Returns a reference to the value associated with the given key.
3457 3481
      Value& operator[](const Key& key) {
3458 3482
        if (SplitNodesBase<const DGR>::inNode(key)) {
3459 3483
          return _in_map[key];
3460 3484
        } else {
3461 3485
          return _out_map[key];
3462 3486
        }
3463 3487
      }
3464 3488

	
3465 3489
      /// Sets the value associated with the given key.
3466 3490
      void set(const Key& key, const Value& value) {
3467 3491
        if (SplitNodesBase<const DGR>::inNode(key)) {
3468 3492
          _in_map.set(key, value);
3469 3493
        } else {
3470 3494
          _out_map.set(key, value);
3471 3495
        }
3472 3496
      }
3473 3497

	
3474 3498
    private:
3475 3499

	
3476 3500
      IN& _in_map;
3477 3501
      OUT& _out_map;
3478 3502

	
3479 3503
    };
3480 3504

	
3481 3505

	
3482 3506
    /// \brief Returns a combined node map
3483 3507
    ///
3484 3508
    /// This function just returns a combined node map.
3485 3509
    template <typename IN, typename OUT>
3486 3510
    static CombinedNodeMap<IN, OUT>
3487 3511
    combinedNodeMap(IN& in_map, OUT& out_map) {
3488 3512
      return CombinedNodeMap<IN, OUT>(in_map, out_map);
3489 3513
    }
3490 3514

	
3491 3515
    template <typename IN, typename OUT>
3492 3516
    static CombinedNodeMap<const IN, OUT>
3493 3517
    combinedNodeMap(const IN& in_map, OUT& out_map) {
3494 3518
      return CombinedNodeMap<const IN, OUT>(in_map, out_map);
3495 3519
    }
3496 3520

	
3497 3521
    template <typename IN, typename OUT>
3498 3522
    static CombinedNodeMap<IN, const OUT>
3499 3523
    combinedNodeMap(IN& in_map, const OUT& out_map) {
3500 3524
      return CombinedNodeMap<IN, const OUT>(in_map, out_map);
3501 3525
    }
3502 3526

	
3503 3527
    template <typename IN, typename OUT>
3504 3528
    static CombinedNodeMap<const IN, const OUT>
3505 3529
    combinedNodeMap(const IN& in_map, const OUT& out_map) {
3506 3530
      return CombinedNodeMap<const IN, const OUT>(in_map, out_map);
3507 3531
    }
3508 3532

	
3509 3533
    /// \brief Arc map combined from an arc map and a node map of the
3510 3534
    /// original digraph.
3511 3535
    ///
3512 3536
    /// This map adaptor class adapts an arc map and a node map of the
3513 3537
    /// original digraph to get an arc map of the split digraph.
3514 3538
    /// Its value type is inherited from the original arc map type (\c AM).
3515 3539
    /// \tparam AM The type of the arc map.
3516 3540
    /// \tparam NM the type of the node map.
3517 3541
    template <typename AM, typename NM>
3518 3542
    class CombinedArcMap {
3519 3543
    public:
3520 3544

	
3521 3545
      /// The key type of the map
3522 3546
      typedef Arc Key;
3523 3547
      /// The value type of the map
3524 3548
      typedef typename AM::Value Value;
3525 3549

	
3526 3550
      typedef typename MapTraits<AM>::ReferenceMapTag ReferenceMapTag;
3527 3551
      typedef typename MapTraits<AM>::ReturnValue ReturnValue;
3528 3552
      typedef typename MapTraits<AM>::ConstReturnValue ConstReturnValue;
3529 3553
      typedef typename MapTraits<AM>::ReturnValue Reference;
3530 3554
      typedef typename MapTraits<AM>::ConstReturnValue ConstReference;
3531 3555

	
3532 3556
      /// Constructor
3533 3557
      CombinedArcMap(AM& arc_map, NM& node_map)
3534 3558
        : _arc_map(arc_map), _node_map(node_map) {}
3535 3559

	
3536 3560
      /// Returns the value associated with the given key.
3537 3561
      Value operator[](const Key& arc) const {
3538 3562
        if (SplitNodesBase<const DGR>::origArc(arc)) {
3539 3563
          return _arc_map[arc];
3540 3564
        } else {
3541 3565
          return _node_map[arc];
3542 3566
        }
3543 3567
      }
3544 3568

	
3545 3569
      /// Returns a reference to the value associated with the given key.
3546 3570
      Value& operator[](const Key& arc) {
3547 3571
        if (SplitNodesBase<const DGR>::origArc(arc)) {
3548 3572
          return _arc_map[arc];
3549 3573
        } else {
3550 3574
          return _node_map[arc];
3551 3575
        }
3552 3576
      }
3553 3577

	
3554 3578
      /// Sets the value associated with the given key.
3555 3579
      void set(const Arc& arc, const Value& val) {
3556 3580
        if (SplitNodesBase<const DGR>::origArc(arc)) {
3557 3581
          _arc_map.set(arc, val);
3558 3582
        } else {
3559 3583
          _node_map.set(arc, val);
3560 3584
        }
3561 3585
      }
3562 3586

	
3563 3587
    private:
3564 3588

	
3565 3589
      AM& _arc_map;
3566 3590
      NM& _node_map;
3567 3591

	
3568 3592
    };
3569 3593

	
3570 3594
    /// \brief Returns a combined arc map
3571 3595
    ///
3572 3596
    /// This function just returns a combined arc map.
3573 3597
    template <typename ArcMap, typename NodeMap>
3574 3598
    static CombinedArcMap<ArcMap, NodeMap>
3575 3599
    combinedArcMap(ArcMap& arc_map, NodeMap& node_map) {
3576 3600
      return CombinedArcMap<ArcMap, NodeMap>(arc_map, node_map);
3577 3601
    }
3578 3602

	
3579 3603
    template <typename ArcMap, typename NodeMap>
3580 3604
    static CombinedArcMap<const ArcMap, NodeMap>
3581 3605
    combinedArcMap(const ArcMap& arc_map, NodeMap& node_map) {
3582 3606
      return CombinedArcMap<const ArcMap, NodeMap>(arc_map, node_map);
3583 3607
    }
3584 3608

	
3585 3609
    template <typename ArcMap, typename NodeMap>
3586 3610
    static CombinedArcMap<ArcMap, const NodeMap>
3587 3611
    combinedArcMap(ArcMap& arc_map, const NodeMap& node_map) {
3588 3612
      return CombinedArcMap<ArcMap, const NodeMap>(arc_map, node_map);
3589 3613
    }
3590 3614

	
3591 3615
    template <typename ArcMap, typename NodeMap>
3592 3616
    static CombinedArcMap<const ArcMap, const NodeMap>
3593 3617
    combinedArcMap(const ArcMap& arc_map, const NodeMap& node_map) {
3594 3618
      return CombinedArcMap<const ArcMap, const NodeMap>(arc_map, node_map);
3595 3619
    }
3596 3620

	
3597 3621
  };
3598 3622

	
3599 3623
  /// \brief Returns a (read-only) SplitNodes adaptor
3600 3624
  ///
3601 3625
  /// This function just returns a (read-only) \ref SplitNodes adaptor.
3602 3626
  /// \ingroup graph_adaptors
3603 3627
  /// \relates SplitNodes
3604 3628
  template<typename DGR>
3605 3629
  SplitNodes<DGR>
3606 3630
  splitNodes(const DGR& digraph) {
3607 3631
    return SplitNodes<DGR>(digraph);
3608 3632
  }
3609 3633

	
3610 3634
#undef LEMON_SCOPE_FIX
3611 3635

	
3612 3636
} //namespace lemon
3613 3637

	
3614 3638
#endif //LEMON_ADAPTORS_H
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5 5
 * Copyright (C) 2003-2009
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_BFS_H
20 20
#define LEMON_BFS_H
21 21

	
22 22
///\ingroup search
23 23
///\file
24 24
///\brief BFS algorithm.
25 25

	
26 26
#include <lemon/list_graph.h>
27 27
#include <lemon/bits/path_dump.h>
28 28
#include <lemon/core.h>
29 29
#include <lemon/error.h>
30 30
#include <lemon/maps.h>
31 31
#include <lemon/path.h>
32 32

	
33 33
namespace lemon {
34 34

	
35 35
  ///Default traits class of Bfs class.
36 36

	
37 37
  ///Default traits class of Bfs class.
38 38
  ///\tparam GR Digraph type.
39 39
  template<class GR>
40 40
  struct BfsDefaultTraits
41 41
  {
42 42
    ///The type of the digraph the algorithm runs on.
43 43
    typedef GR Digraph;
44 44

	
45 45
    ///\brief The type of the map that stores the predecessor
46 46
    ///arcs of the shortest paths.
47 47
    ///
48 48
    ///The type of the map that stores the predecessor
49 49
    ///arcs of the shortest paths.
50 50
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
51 51
    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
52 52
    ///Instantiates a \c PredMap.
53 53

	
54 54
    ///This function instantiates a \ref PredMap.
55 55
    ///\param g is the digraph, to which we would like to define the
56 56
    ///\ref PredMap.
57 57
    static PredMap *createPredMap(const Digraph &g)
58 58
    {
59 59
      return new PredMap(g);
60 60
    }
61 61

	
62 62
    ///The type of the map that indicates which nodes are processed.
63 63

	
64 64
    ///The type of the map that indicates which nodes are processed.
65 65
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
66 66
    ///By default it is a NullMap.
67 67
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
68 68
    ///Instantiates a \c ProcessedMap.
69 69

	
70 70
    ///This function instantiates a \ref ProcessedMap.
71 71
    ///\param g is the digraph, to which
72 72
    ///we would like to define the \ref ProcessedMap
73 73
#ifdef DOXYGEN
74 74
    static ProcessedMap *createProcessedMap(const Digraph &g)
75 75
#else
76 76
    static ProcessedMap *createProcessedMap(const Digraph &)
77 77
#endif
78 78
    {
79 79
      return new ProcessedMap();
80 80
    }
81 81

	
82 82
    ///The type of the map that indicates which nodes are reached.
83 83

	
84 84
    ///The type of the map that indicates which nodes are reached.
85 85
    ///It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
86 86
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
87 87
    ///Instantiates a \c ReachedMap.
88 88

	
89 89
    ///This function instantiates a \ref ReachedMap.
90 90
    ///\param g is the digraph, to which
91 91
    ///we would like to define the \ref ReachedMap.
92 92
    static ReachedMap *createReachedMap(const Digraph &g)
93 93
    {
94 94
      return new ReachedMap(g);
95 95
    }
96 96

	
97 97
    ///The type of the map that stores the distances of the nodes.
98 98

	
99 99
    ///The type of the map that stores the distances of the nodes.
100 100
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
101 101
    typedef typename Digraph::template NodeMap<int> DistMap;
102 102
    ///Instantiates a \c DistMap.
103 103

	
104 104
    ///This function instantiates a \ref DistMap.
105 105
    ///\param g is the digraph, to which we would like to define the
106 106
    ///\ref DistMap.
107 107
    static DistMap *createDistMap(const Digraph &g)
108 108
    {
109 109
      return new DistMap(g);
110 110
    }
111 111
  };
112 112

	
113 113
  ///%BFS algorithm class.
114 114

	
115 115
  ///\ingroup search
116 116
  ///This class provides an efficient implementation of the %BFS algorithm.
117 117
  ///
118 118
  ///There is also a \ref bfs() "function-type interface" for the BFS
119 119
  ///algorithm, which is convenient in the simplier cases and it can be
120 120
  ///used easier.
121 121
  ///
122 122
  ///\tparam GR The type of the digraph the algorithm runs on.
123 123
  ///The default type is \ref ListDigraph.
124 124
#ifdef DOXYGEN
125 125
  template <typename GR,
126 126
            typename TR>
127 127
#else
128 128
  template <typename GR=ListDigraph,
129 129
            typename TR=BfsDefaultTraits<GR> >
130 130
#endif
131 131
  class Bfs {
132 132
  public:
133 133

	
134 134
    ///The type of the digraph the algorithm runs on.
135 135
    typedef typename TR::Digraph Digraph;
136 136

	
137 137
    ///\brief The type of the map that stores the predecessor arcs of the
138 138
    ///shortest paths.
139 139
    typedef typename TR::PredMap PredMap;
140 140
    ///The type of the map that stores the distances of the nodes.
141 141
    typedef typename TR::DistMap DistMap;
142 142
    ///The type of the map that indicates which nodes are reached.
143 143
    typedef typename TR::ReachedMap ReachedMap;
144 144
    ///The type of the map that indicates which nodes are processed.
145 145
    typedef typename TR::ProcessedMap ProcessedMap;
146 146
    ///The type of the paths.
147 147
    typedef PredMapPath<Digraph, PredMap> Path;
148 148

	
149 149
    ///The \ref BfsDefaultTraits "traits class" of the algorithm.
150 150
    typedef TR Traits;
151 151

	
152 152
  private:
153 153

	
154 154
    typedef typename Digraph::Node Node;
155 155
    typedef typename Digraph::NodeIt NodeIt;
156 156
    typedef typename Digraph::Arc Arc;
157 157
    typedef typename Digraph::OutArcIt OutArcIt;
158 158

	
159 159
    //Pointer to the underlying digraph.
160 160
    const Digraph *G;
161 161
    //Pointer to the map of predecessor arcs.
162 162
    PredMap *_pred;
163 163
    //Indicates if _pred is locally allocated (true) or not.
164 164
    bool local_pred;
165 165
    //Pointer to the map of distances.
166 166
    DistMap *_dist;
167 167
    //Indicates if _dist is locally allocated (true) or not.
168 168
    bool local_dist;
169 169
    //Pointer to the map of reached status of the nodes.
170 170
    ReachedMap *_reached;
171 171
    //Indicates if _reached is locally allocated (true) or not.
172 172
    bool local_reached;
173 173
    //Pointer to the map of processed status of the nodes.
174 174
    ProcessedMap *_processed;
175 175
    //Indicates if _processed is locally allocated (true) or not.
176 176
    bool local_processed;
177 177

	
178 178
    std::vector<typename Digraph::Node> _queue;
179 179
    int _queue_head,_queue_tail,_queue_next_dist;
180 180
    int _curr_dist;
181 181

	
182 182
    //Creates the maps if necessary.
183 183
    void create_maps()
184 184
    {
185 185
      if(!_pred) {
186 186
        local_pred = true;
187 187
        _pred = Traits::createPredMap(*G);
188 188
      }
189 189
      if(!_dist) {
190 190
        local_dist = true;
191 191
        _dist = Traits::createDistMap(*G);
192 192
      }
193 193
      if(!_reached) {
194 194
        local_reached = true;
195 195
        _reached = Traits::createReachedMap(*G);
196 196
      }
197 197
      if(!_processed) {
198 198
        local_processed = true;
199 199
        _processed = Traits::createProcessedMap(*G);
200 200
      }
201 201
    }
202 202

	
203 203
  protected:
204 204

	
205 205
    Bfs() {}
206 206

	
207 207
  public:
208 208

	
209 209
    typedef Bfs Create;
210 210

	
211 211
    ///\name Named Template Parameters
212 212

	
213 213
    ///@{
214 214

	
215 215
    template <class T>
216 216
    struct SetPredMapTraits : public Traits {
217 217
      typedef T PredMap;
218 218
      static PredMap *createPredMap(const Digraph &)
219 219
      {
220 220
        LEMON_ASSERT(false, "PredMap is not initialized");
221 221
        return 0; // ignore warnings
222 222
      }
223 223
    };
224 224
    ///\brief \ref named-templ-param "Named parameter" for setting
225 225
    ///\c PredMap type.
226 226
    ///
227 227
    ///\ref named-templ-param "Named parameter" for setting
228 228
    ///\c PredMap type.
229 229
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
230 230
    template <class T>
231 231
    struct SetPredMap : public Bfs< Digraph, SetPredMapTraits<T> > {
232 232
      typedef Bfs< Digraph, SetPredMapTraits<T> > Create;
233 233
    };
234 234

	
235 235
    template <class T>
236 236
    struct SetDistMapTraits : public Traits {
237 237
      typedef T DistMap;
238 238
      static DistMap *createDistMap(const Digraph &)
239 239
      {
240 240
        LEMON_ASSERT(false, "DistMap is not initialized");
241 241
        return 0; // ignore warnings
242 242
      }
243 243
    };
244 244
    ///\brief \ref named-templ-param "Named parameter" for setting
245 245
    ///\c DistMap type.
246 246
    ///
247 247
    ///\ref named-templ-param "Named parameter" for setting
248 248
    ///\c DistMap type.
249 249
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
250 250
    template <class T>
251 251
    struct SetDistMap : public Bfs< Digraph, SetDistMapTraits<T> > {
252 252
      typedef Bfs< Digraph, SetDistMapTraits<T> > Create;
253 253
    };
254 254

	
255 255
    template <class T>
256 256
    struct SetReachedMapTraits : public Traits {
257 257
      typedef T ReachedMap;
258 258
      static ReachedMap *createReachedMap(const Digraph &)
259 259
      {
260 260
        LEMON_ASSERT(false, "ReachedMap is not initialized");
261 261
        return 0; // ignore warnings
262 262
      }
263 263
    };
264 264
    ///\brief \ref named-templ-param "Named parameter" for setting
265 265
    ///\c ReachedMap type.
266 266
    ///
267 267
    ///\ref named-templ-param "Named parameter" for setting
268 268
    ///\c ReachedMap type.
269 269
    ///It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
270 270
    template <class T>
271 271
    struct SetReachedMap : public Bfs< Digraph, SetReachedMapTraits<T> > {
272 272
      typedef Bfs< Digraph, SetReachedMapTraits<T> > Create;
273 273
    };
274 274

	
275 275
    template <class T>
276 276
    struct SetProcessedMapTraits : public Traits {
277 277
      typedef T ProcessedMap;
278 278
      static ProcessedMap *createProcessedMap(const Digraph &)
279 279
      {
280 280
        LEMON_ASSERT(false, "ProcessedMap is not initialized");
281 281
        return 0; // ignore warnings
282 282
      }
283 283
    };
284 284
    ///\brief \ref named-templ-param "Named parameter" for setting
285 285
    ///\c ProcessedMap type.
286 286
    ///
287 287
    ///\ref named-templ-param "Named parameter" for setting
288 288
    ///\c ProcessedMap type.
289 289
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
290 290
    template <class T>
291 291
    struct SetProcessedMap : public Bfs< Digraph, SetProcessedMapTraits<T> > {
292 292
      typedef Bfs< Digraph, SetProcessedMapTraits<T> > Create;
293 293
    };
294 294

	
295 295
    struct SetStandardProcessedMapTraits : public Traits {
296 296
      typedef typename Digraph::template NodeMap<bool> ProcessedMap;
297 297
      static ProcessedMap *createProcessedMap(const Digraph &g)
298 298
      {
299 299
        return new ProcessedMap(g);
300 300
        return 0; // ignore warnings
301 301
      }
302 302
    };
303 303
    ///\brief \ref named-templ-param "Named parameter" for setting
304 304
    ///\c ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
305 305
    ///
306 306
    ///\ref named-templ-param "Named parameter" for setting
307 307
    ///\c ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
308 308
    ///If you don't set it explicitly, it will be automatically allocated.
309 309
    struct SetStandardProcessedMap :
310 310
      public Bfs< Digraph, SetStandardProcessedMapTraits > {
311 311
      typedef Bfs< Digraph, SetStandardProcessedMapTraits > Create;
312 312
    };
313 313

	
314 314
    ///@}
315 315

	
316 316
  public:
317 317

	
318 318
    ///Constructor.
319 319

	
320 320
    ///Constructor.
321 321
    ///\param g The digraph the algorithm runs on.
322 322
    Bfs(const Digraph &g) :
323 323
      G(&g),
324 324
      _pred(NULL), local_pred(false),
325 325
      _dist(NULL), local_dist(false),
326 326
      _reached(NULL), local_reached(false),
327 327
      _processed(NULL), local_processed(false)
328 328
    { }
329 329

	
330 330
    ///Destructor.
331 331
    ~Bfs()
332 332
    {
333 333
      if(local_pred) delete _pred;
334 334
      if(local_dist) delete _dist;
335 335
      if(local_reached) delete _reached;
336 336
      if(local_processed) delete _processed;
337 337
    }
338 338

	
339 339
    ///Sets the map that stores the predecessor arcs.
340 340

	
341 341
    ///Sets the map that stores the predecessor arcs.
342 342
    ///If you don't use this function before calling \ref run(Node) "run()"
343 343
    ///or \ref init(), an instance will be allocated automatically.
344 344
    ///The destructor deallocates this automatically allocated map,
345 345
    ///of course.
346 346
    ///\return <tt> (*this) </tt>
347 347
    Bfs &predMap(PredMap &m)
348 348
    {
349 349
      if(local_pred) {
350 350
        delete _pred;
351 351
        local_pred=false;
352 352
      }
353 353
      _pred = &m;
354 354
      return *this;
355 355
    }
356 356

	
357 357
    ///Sets the map that indicates which nodes are reached.
358 358

	
359 359
    ///Sets the map that indicates which nodes are reached.
360 360
    ///If you don't use this function before calling \ref run(Node) "run()"
361 361
    ///or \ref init(), an instance will be allocated automatically.
362 362
    ///The destructor deallocates this automatically allocated map,
363 363
    ///of course.
364 364
    ///\return <tt> (*this) </tt>
365 365
    Bfs &reachedMap(ReachedMap &m)
366 366
    {
367 367
      if(local_reached) {
368 368
        delete _reached;
369 369
        local_reached=false;
370 370
      }
371 371
      _reached = &m;
372 372
      return *this;
373 373
    }
374 374

	
375 375
    ///Sets the map that indicates which nodes are processed.
376 376

	
377 377
    ///Sets the map that indicates which nodes are processed.
378 378
    ///If you don't use this function before calling \ref run(Node) "run()"
379 379
    ///or \ref init(), an instance will be allocated automatically.
380 380
    ///The destructor deallocates this automatically allocated map,
381 381
    ///of course.
382 382
    ///\return <tt> (*this) </tt>
383 383
    Bfs &processedMap(ProcessedMap &m)
384 384
    {
385 385
      if(local_processed) {
386 386
        delete _processed;
387 387
        local_processed=false;
388 388
      }
389 389
      _processed = &m;
390 390
      return *this;
391 391
    }
392 392

	
393 393
    ///Sets the map that stores the distances of the nodes.
394 394

	
395 395
    ///Sets the map that stores the distances of the nodes calculated by
396 396
    ///the algorithm.
397 397
    ///If you don't use this function before calling \ref run(Node) "run()"
398 398
    ///or \ref init(), an instance will be allocated automatically.
399 399
    ///The destructor deallocates this automatically allocated map,
400 400
    ///of course.
401 401
    ///\return <tt> (*this) </tt>
402 402
    Bfs &distMap(DistMap &m)
403 403
    {
404 404
      if(local_dist) {
405 405
        delete _dist;
406 406
        local_dist=false;
407 407
      }
408 408
      _dist = &m;
409 409
      return *this;
410 410
    }
411 411

	
412 412
  public:
413 413

	
414 414
    ///\name Execution Control
415 415
    ///The simplest way to execute the BFS algorithm is to use one of the
416 416
    ///member functions called \ref run(Node) "run()".\n
417 417
    ///If you need better control on the execution, you have to call
418 418
    ///\ref init() first, then you can add several source nodes with
419 419
    ///\ref addSource(). Finally the actual path computation can be
420 420
    ///performed with one of the \ref start() functions.
421 421

	
422 422
    ///@{
423 423

	
424 424
    ///\brief Initializes the internal data structures.
425 425
    ///
426 426
    ///Initializes the internal data structures.
427 427
    void init()
428 428
    {
429 429
      create_maps();
430 430
      _queue.resize(countNodes(*G));
431 431
      _queue_head=_queue_tail=0;
432 432
      _curr_dist=1;
433 433
      for ( NodeIt u(*G) ; u!=INVALID ; ++u ) {
434 434
        _pred->set(u,INVALID);
435 435
        _reached->set(u,false);
436 436
        _processed->set(u,false);
437 437
      }
438 438
    }
439 439

	
440 440
    ///Adds a new source node.
441 441

	
442 442
    ///Adds a new source node to the set of nodes to be processed.
443 443
    ///
444 444
    void addSource(Node s)
445 445
    {
446 446
      if(!(*_reached)[s])
447 447
        {
448 448
          _reached->set(s,true);
449 449
          _pred->set(s,INVALID);
450 450
          _dist->set(s,0);
451 451
          _queue[_queue_head++]=s;
452 452
          _queue_next_dist=_queue_head;
453 453
        }
454 454
    }
455 455

	
456 456
    ///Processes the next node.
457 457

	
458 458
    ///Processes the next node.
459 459
    ///
460 460
    ///\return The processed node.
461 461
    ///
462 462
    ///\pre The queue must not be empty.
463 463
    Node processNextNode()
464 464
    {
465 465
      if(_queue_tail==_queue_next_dist) {
466 466
        _curr_dist++;
467 467
        _queue_next_dist=_queue_head;
468 468
      }
469 469
      Node n=_queue[_queue_tail++];
470 470
      _processed->set(n,true);
471 471
      Node m;
472 472
      for(OutArcIt e(*G,n);e!=INVALID;++e)
473 473
        if(!(*_reached)[m=G->target(e)]) {
474 474
          _queue[_queue_head++]=m;
475 475
          _reached->set(m,true);
476 476
          _pred->set(m,e);
477 477
          _dist->set(m,_curr_dist);
478 478
        }
479 479
      return n;
480 480
    }
481 481

	
482 482
    ///Processes the next node.
483 483

	
484 484
    ///Processes the next node and checks if the given target node
485 485
    ///is reached. If the target node is reachable from the processed
486 486
    ///node, then the \c reach parameter will be set to \c true.
487 487
    ///
488 488
    ///\param target The target node.
489 489
    ///\retval reach Indicates if the target node is reached.
490 490
    ///It should be initially \c false.
491 491
    ///
492 492
    ///\return The processed node.
493 493
    ///
494 494
    ///\pre The queue must not be empty.
495 495
    Node processNextNode(Node target, bool& reach)
496 496
    {
497 497
      if(_queue_tail==_queue_next_dist) {
498 498
        _curr_dist++;
499 499
        _queue_next_dist=_queue_head;
500 500
      }
501 501
      Node n=_queue[_queue_tail++];
502 502
      _processed->set(n,true);
503 503
      Node m;
504 504
      for(OutArcIt e(*G,n);e!=INVALID;++e)
505 505
        if(!(*_reached)[m=G->target(e)]) {
506 506
          _queue[_queue_head++]=m;
507 507
          _reached->set(m,true);
508 508
          _pred->set(m,e);
509 509
          _dist->set(m,_curr_dist);
510 510
          reach = reach || (target == m);
511 511
        }
512 512
      return n;
513 513
    }
514 514

	
515 515
    ///Processes the next node.
516 516

	
517 517
    ///Processes the next node and checks if at least one of reached
518 518
    ///nodes has \c true value in the \c nm node map. If one node
519 519
    ///with \c true value is reachable from the processed node, then the
520 520
    ///\c rnode parameter will be set to the first of such nodes.
521 521
    ///
522 522
    ///\param nm A \c bool (or convertible) node map that indicates the
523 523
    ///possible targets.
524 524
    ///\retval rnode The reached target node.
525 525
    ///It should be initially \c INVALID.
526 526
    ///
527 527
    ///\return The processed node.
528 528
    ///
529 529
    ///\pre The queue must not be empty.
530 530
    template<class NM>
531 531
    Node processNextNode(const NM& nm, Node& rnode)
532 532
    {
533 533
      if(_queue_tail==_queue_next_dist) {
534 534
        _curr_dist++;
535 535
        _queue_next_dist=_queue_head;
536 536
      }
537 537
      Node n=_queue[_queue_tail++];
538 538
      _processed->set(n,true);
539 539
      Node m;
540 540
      for(OutArcIt e(*G,n);e!=INVALID;++e)
541 541
        if(!(*_reached)[m=G->target(e)]) {
542 542
          _queue[_queue_head++]=m;
543 543
          _reached->set(m,true);
544 544
          _pred->set(m,e);
545 545
          _dist->set(m,_curr_dist);
546 546
          if (nm[m] && rnode == INVALID) rnode = m;
547 547
        }
548 548
      return n;
549 549
    }
550 550

	
551 551
    ///The next node to be processed.
552 552

	
553 553
    ///Returns the next node to be processed or \c INVALID if the queue
554 554
    ///is empty.
555 555
    Node nextNode() const
556 556
    {
557 557
      return _queue_tail<_queue_head?_queue[_queue_tail]:INVALID;
558 558
    }
559 559

	
560 560
    ///Returns \c false if there are nodes to be processed.
561 561

	
562 562
    ///Returns \c false if there are nodes to be processed
563 563
    ///in the queue.
564 564
    bool emptyQueue() const { return _queue_tail==_queue_head; }
565 565

	
566 566
    ///Returns the number of the nodes to be processed.
567 567

	
568 568
    ///Returns the number of the nodes to be processed
569 569
    ///in the queue.
570 570
    int queueSize() const { return _queue_head-_queue_tail; }
571 571

	
572 572
    ///Executes the algorithm.
573 573

	
574 574
    ///Executes the algorithm.
575 575
    ///
576 576
    ///This method runs the %BFS algorithm from the root node(s)
577 577
    ///in order to compute the shortest path to each node.
578 578
    ///
579 579
    ///The algorithm computes
580 580
    ///- the shortest path tree (forest),
581 581
    ///- the distance of each node from the root(s).
582 582
    ///
583 583
    ///\pre init() must be called and at least one root node should be
584 584
    ///added with addSource() before using this function.
585 585
    ///
586 586
    ///\note <tt>b.start()</tt> is just a shortcut of the following code.
587 587
    ///\code
588 588
    ///  while ( !b.emptyQueue() ) {
589 589
    ///    b.processNextNode();
590 590
    ///  }
591 591
    ///\endcode
592 592
    void start()
593 593
    {
594 594
      while ( !emptyQueue() ) processNextNode();
595 595
    }
596 596

	
597 597
    ///Executes the algorithm until the given target node is reached.
598 598

	
599 599
    ///Executes the algorithm until the given target node is reached.
600 600
    ///
601 601
    ///This method runs the %BFS algorithm from the root node(s)
602 602
    ///in order to compute the shortest path to \c t.
603 603
    ///
604 604
    ///The algorithm computes
605 605
    ///- the shortest path to \c t,
606 606
    ///- the distance of \c t from the root(s).
607 607
    ///
608 608
    ///\pre init() must be called and at least one root node should be
609 609
    ///added with addSource() before using this function.
610 610
    ///
611 611
    ///\note <tt>b.start(t)</tt> is just a shortcut of the following code.
612 612
    ///\code
613 613
    ///  bool reach = false;
614 614
    ///  while ( !b.emptyQueue() && !reach ) {
615 615
    ///    b.processNextNode(t, reach);
616 616
    ///  }
617 617
    ///\endcode
618 618
    void start(Node t)
619 619
    {
620 620
      bool reach = false;
621 621
      while ( !emptyQueue() && !reach ) processNextNode(t, reach);
622 622
    }
623 623

	
624 624
    ///Executes the algorithm until a condition is met.
625 625

	
626 626
    ///Executes the algorithm until a condition is met.
627 627
    ///
628 628
    ///This method runs the %BFS algorithm from the root node(s) in
629 629
    ///order to compute the shortest path to a node \c v with
630 630
    /// <tt>nm[v]</tt> true, if such a node can be found.
631 631
    ///
632 632
    ///\param nm A \c bool (or convertible) node map. The algorithm
633 633
    ///will stop when it reaches a node \c v with <tt>nm[v]</tt> true.
634 634
    ///
635 635
    ///\return The reached node \c v with <tt>nm[v]</tt> true or
636 636
    ///\c INVALID if no such node was found.
637 637
    ///
638 638
    ///\pre init() must be called and at least one root node should be
639 639
    ///added with addSource() before using this function.
640 640
    ///
641 641
    ///\note <tt>b.start(nm)</tt> is just a shortcut of the following code.
642 642
    ///\code
643 643
    ///  Node rnode = INVALID;
644 644
    ///  while ( !b.emptyQueue() && rnode == INVALID ) {
645 645
    ///    b.processNextNode(nm, rnode);
646 646
    ///  }
647 647
    ///  return rnode;
648 648
    ///\endcode
649 649
    template<class NodeBoolMap>
650 650
    Node start(const NodeBoolMap &nm)
651 651
    {
652 652
      Node rnode = INVALID;
653 653
      while ( !emptyQueue() && rnode == INVALID ) {
654 654
        processNextNode(nm, rnode);
655 655
      }
656 656
      return rnode;
657 657
    }
658 658

	
659 659
    ///Runs the algorithm from the given source node.
660 660

	
661 661
    ///This method runs the %BFS algorithm from node \c s
662 662
    ///in order to compute the shortest path to each node.
663 663
    ///
664 664
    ///The algorithm computes
665 665
    ///- the shortest path tree,
666 666
    ///- the distance of each node from the root.
667 667
    ///
668 668
    ///\note <tt>b.run(s)</tt> is just a shortcut of the following code.
669 669
    ///\code
670 670
    ///  b.init();
671 671
    ///  b.addSource(s);
672 672
    ///  b.start();
673 673
    ///\endcode
674 674
    void run(Node s) {
675 675
      init();
676 676
      addSource(s);
677 677
      start();
678 678
    }
679 679

	
680 680
    ///Finds the shortest path between \c s and \c t.
681 681

	
682 682
    ///This method runs the %BFS algorithm from node \c s
683 683
    ///in order to compute the shortest path to node \c t
684 684
    ///(it stops searching when \c t is processed).
685 685
    ///
686 686
    ///\return \c true if \c t is reachable form \c s.
687 687
    ///
688 688
    ///\note Apart from the return value, <tt>b.run(s,t)</tt> is just a
689 689
    ///shortcut of the following code.
690 690
    ///\code
691 691
    ///  b.init();
692 692
    ///  b.addSource(s);
693 693
    ///  b.start(t);
694 694
    ///\endcode
695 695
    bool run(Node s,Node t) {
696 696
      init();
697 697
      addSource(s);
698 698
      start(t);
699 699
      return reached(t);
700 700
    }
701 701

	
702 702
    ///Runs the algorithm to visit all nodes in the digraph.
703 703

	
704
    ///This method runs the %BFS algorithm in order to
705
    ///compute the shortest path to each node.
706
    ///
707
    ///The algorithm computes
708
    ///- the shortest path tree (forest),
709
    ///- the distance of each node from the root(s).
704
    ///This method runs the %BFS algorithm in order to visit all nodes
705
    ///in the digraph.
710 706
    ///
711 707
    ///\note <tt>b.run(s)</tt> is just a shortcut of the following code.
712 708
    ///\code
713 709
    ///  b.init();
714 710
    ///  for (NodeIt n(gr); n != INVALID; ++n) {
715 711
    ///    if (!b.reached(n)) {
716 712
    ///      b.addSource(n);
717 713
    ///      b.start();
718 714
    ///    }
719 715
    ///  }
720 716
    ///\endcode
721 717
    void run() {
722 718
      init();
723 719
      for (NodeIt n(*G); n != INVALID; ++n) {
724 720
        if (!reached(n)) {
725 721
          addSource(n);
726 722
          start();
727 723
        }
728 724
      }
729 725
    }
730 726

	
731 727
    ///@}
732 728

	
733 729
    ///\name Query Functions
734 730
    ///The results of the BFS algorithm can be obtained using these
735 731
    ///functions.\n
736 732
    ///Either \ref run(Node) "run()" or \ref start() should be called
737 733
    ///before using them.
738 734

	
739 735
    ///@{
740 736

	
741 737
    ///The shortest path to the given node.
742 738

	
743 739
    ///Returns the shortest path to the given node from the root(s).
744 740
    ///
745 741
    ///\warning \c t should be reached from the root(s).
746 742
    ///
747 743
    ///\pre Either \ref run(Node) "run()" or \ref init()
748 744
    ///must be called before using this function.
749 745
    Path path(Node t) const { return Path(*G, *_pred, t); }
750 746

	
751 747
    ///The distance of the given node from the root(s).
752 748

	
753 749
    ///Returns the distance of the given node from the root(s).
754 750
    ///
755 751
    ///\warning If node \c v is not reached from the root(s), then
756 752
    ///the return value of this function is undefined.
757 753
    ///
758 754
    ///\pre Either \ref run(Node) "run()" or \ref init()
759 755
    ///must be called before using this function.
760 756
    int dist(Node v) const { return (*_dist)[v]; }
761 757

	
762 758
    ///\brief Returns the 'previous arc' of the shortest path tree for
763 759
    ///the given node.
764 760
    ///
765 761
    ///This function returns the 'previous arc' of the shortest path
766 762
    ///tree for the node \c v, i.e. it returns the last arc of a
767 763
    ///shortest path from a root to \c v. It is \c INVALID if \c v
768 764
    ///is not reached from the root(s) or if \c v is a root.
769 765
    ///
770 766
    ///The shortest path tree used here is equal to the shortest path
771 767
    ///tree used in \ref predNode() and \ref predMap().
772 768
    ///
773 769
    ///\pre Either \ref run(Node) "run()" or \ref init()
774 770
    ///must be called before using this function.
775 771
    Arc predArc(Node v) const { return (*_pred)[v];}
776 772

	
777 773
    ///\brief Returns the 'previous node' of the shortest path tree for
778 774
    ///the given node.
779 775
    ///
780 776
    ///This function returns the 'previous node' of the shortest path
781 777
    ///tree for the node \c v, i.e. it returns the last but one node
782 778
    ///of a shortest path from a root to \c v. It is \c INVALID
783 779
    ///if \c v is not reached from the root(s) or if \c v is a root.
784 780
    ///
785 781
    ///The shortest path tree used here is equal to the shortest path
786 782
    ///tree used in \ref predArc() and \ref predMap().
787 783
    ///
788 784
    ///\pre Either \ref run(Node) "run()" or \ref init()
789 785
    ///must be called before using this function.
790 786
    Node predNode(Node v) const { return (*_pred)[v]==INVALID ? INVALID:
791 787
                                  G->source((*_pred)[v]); }
792 788

	
793 789
    ///\brief Returns a const reference to the node map that stores the
794 790
    /// distances of the nodes.
795 791
    ///
796 792
    ///Returns a const reference to the node map that stores the distances
797 793
    ///of the nodes calculated by the algorithm.
798 794
    ///
799 795
    ///\pre Either \ref run(Node) "run()" or \ref init()
800 796
    ///must be called before using this function.
801 797
    const DistMap &distMap() const { return *_dist;}
802 798

	
803 799
    ///\brief Returns a const reference to the node map that stores the
804 800
    ///predecessor arcs.
805 801
    ///
806 802
    ///Returns a const reference to the node map that stores the predecessor
807 803
    ///arcs, which form the shortest path tree (forest).
808 804
    ///
809 805
    ///\pre Either \ref run(Node) "run()" or \ref init()
810 806
    ///must be called before using this function.
811 807
    const PredMap &predMap() const { return *_pred;}
812 808

	
813 809
    ///Checks if the given node is reached from the root(s).
814 810

	
815 811
    ///Returns \c true if \c v is reached from the root(s).
816 812
    ///
817 813
    ///\pre Either \ref run(Node) "run()" or \ref init()
818 814
    ///must be called before using this function.
819 815
    bool reached(Node v) const { return (*_reached)[v]; }
820 816

	
821 817
    ///@}
822 818
  };
823 819

	
824 820
  ///Default traits class of bfs() function.
825 821

	
826 822
  ///Default traits class of bfs() function.
827 823
  ///\tparam GR Digraph type.
828 824
  template<class GR>
829 825
  struct BfsWizardDefaultTraits
830 826
  {
831 827
    ///The type of the digraph the algorithm runs on.
832 828
    typedef GR Digraph;
833 829

	
834 830
    ///\brief The type of the map that stores the predecessor
835 831
    ///arcs of the shortest paths.
836 832
    ///
837 833
    ///The type of the map that stores the predecessor
838 834
    ///arcs of the shortest paths.
839 835
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
840 836
    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
841 837
    ///Instantiates a PredMap.
842 838

	
843 839
    ///This function instantiates a PredMap.
844 840
    ///\param g is the digraph, to which we would like to define the
845 841
    ///PredMap.
846 842
    static PredMap *createPredMap(const Digraph &g)
847 843
    {
848 844
      return new PredMap(g);
849 845
    }
850 846

	
851 847
    ///The type of the map that indicates which nodes are processed.
852 848

	
853 849
    ///The type of the map that indicates which nodes are processed.
854 850
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
855 851
    ///By default it is a NullMap.
856 852
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
857 853
    ///Instantiates a ProcessedMap.
858 854

	
859 855
    ///This function instantiates a ProcessedMap.
860 856
    ///\param g is the digraph, to which
861 857
    ///we would like to define the ProcessedMap.
862 858
#ifdef DOXYGEN
863 859
    static ProcessedMap *createProcessedMap(const Digraph &g)
864 860
#else
865 861
    static ProcessedMap *createProcessedMap(const Digraph &)
866 862
#endif
867 863
    {
868 864
      return new ProcessedMap();
869 865
    }
870 866

	
871 867
    ///The type of the map that indicates which nodes are reached.
872 868

	
873 869
    ///The type of the map that indicates which nodes are reached.
874 870
    ///It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
875 871
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
876 872
    ///Instantiates a ReachedMap.
877 873

	
878 874
    ///This function instantiates a ReachedMap.
879 875
    ///\param g is the digraph, to which
880 876
    ///we would like to define the ReachedMap.
881 877
    static ReachedMap *createReachedMap(const Digraph &g)
882 878
    {
883 879
      return new ReachedMap(g);
884 880
    }
885 881

	
886 882
    ///The type of the map that stores the distances of the nodes.
887 883

	
888 884
    ///The type of the map that stores the distances of the nodes.
889 885
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
890 886
    typedef typename Digraph::template NodeMap<int> DistMap;
891 887
    ///Instantiates a DistMap.
892 888

	
893 889
    ///This function instantiates a DistMap.
894 890
    ///\param g is the digraph, to which we would like to define
895 891
    ///the DistMap
896 892
    static DistMap *createDistMap(const Digraph &g)
897 893
    {
898 894
      return new DistMap(g);
899 895
    }
900 896

	
901 897
    ///The type of the shortest paths.
902 898

	
903 899
    ///The type of the shortest paths.
904 900
    ///It must conform to the \ref concepts::Path "Path" concept.
905 901
    typedef lemon::Path<Digraph> Path;
906 902
  };
907 903

	
908 904
  /// Default traits class used by BfsWizard
909 905

	
910 906
  /// Default traits class used by BfsWizard.
911 907
  /// \tparam GR The type of the digraph.
912 908
  template<class GR>
913 909
  class BfsWizardBase : public BfsWizardDefaultTraits<GR>
914 910
  {
915 911

	
916 912
    typedef BfsWizardDefaultTraits<GR> Base;
917 913
  protected:
918 914
    //The type of the nodes in the digraph.
919 915
    typedef typename Base::Digraph::Node Node;
920 916

	
921 917
    //Pointer to the digraph the algorithm runs on.
922 918
    void *_g;
923 919
    //Pointer to the map of reached nodes.
924 920
    void *_reached;
925 921
    //Pointer to the map of processed nodes.
926 922
    void *_processed;
927 923
    //Pointer to the map of predecessors arcs.
928 924
    void *_pred;
929 925
    //Pointer to the map of distances.
930 926
    void *_dist;
931 927
    //Pointer to the shortest path to the target node.
932 928
    void *_path;
933 929
    //Pointer to the distance of the target node.
934 930
    int *_di;
935 931

	
936 932
    public:
937 933
    /// Constructor.
938 934

	
939 935
    /// This constructor does not require parameters, it initiates
940 936
    /// all of the attributes to \c 0.
941 937
    BfsWizardBase() : _g(0), _reached(0), _processed(0), _pred(0),
942 938
                      _dist(0), _path(0), _di(0) {}
943 939

	
944 940
    /// Constructor.
945 941

	
946 942
    /// This constructor requires one parameter,
947 943
    /// others are initiated to \c 0.
948 944
    /// \param g The digraph the algorithm runs on.
949 945
    BfsWizardBase(const GR &g) :
950 946
      _g(reinterpret_cast<void*>(const_cast<GR*>(&g))),
951 947
      _reached(0), _processed(0), _pred(0), _dist(0),  _path(0), _di(0) {}
952 948

	
953 949
  };
954 950

	
955 951
  /// Auxiliary class for the function-type interface of BFS algorithm.
956 952

	
957 953
  /// This auxiliary class is created to implement the
958 954
  /// \ref bfs() "function-type interface" of \ref Bfs algorithm.
959 955
  /// It does not have own \ref run(Node) "run()" method, it uses the
960 956
  /// functions and features of the plain \ref Bfs.
961 957
  ///
962 958
  /// This class should only be used through the \ref bfs() function,
963 959
  /// which makes it easier to use the algorithm.
964 960
  template<class TR>
965 961
  class BfsWizard : public TR
966 962
  {
967 963
    typedef TR Base;
968 964

	
969 965
    typedef typename TR::Digraph Digraph;
970 966

	
971 967
    typedef typename Digraph::Node Node;
972 968
    typedef typename Digraph::NodeIt NodeIt;
973 969
    typedef typename Digraph::Arc Arc;
974 970
    typedef typename Digraph::OutArcIt OutArcIt;
975 971

	
976 972
    typedef typename TR::PredMap PredMap;
977 973
    typedef typename TR::DistMap DistMap;
978 974
    typedef typename TR::ReachedMap ReachedMap;
979 975
    typedef typename TR::ProcessedMap ProcessedMap;
980 976
    typedef typename TR::Path Path;
981 977

	
982 978
  public:
983 979

	
984 980
    /// Constructor.
985 981
    BfsWizard() : TR() {}
986 982

	
987 983
    /// Constructor that requires parameters.
988 984

	
989 985
    /// Constructor that requires parameters.
990 986
    /// These parameters will be the default values for the traits class.
991 987
    /// \param g The digraph the algorithm runs on.
992 988
    BfsWizard(const Digraph &g) :
993 989
      TR(g) {}
994 990

	
995 991
    ///Copy constructor
996 992
    BfsWizard(const TR &b) : TR(b) {}
997 993

	
998 994
    ~BfsWizard() {}
999 995

	
1000 996
    ///Runs BFS algorithm from the given source node.
1001 997

	
1002 998
    ///This method runs BFS algorithm from node \c s
1003 999
    ///in order to compute the shortest path to each node.
1004 1000
    void run(Node s)
1005 1001
    {
1006 1002
      Bfs<Digraph,TR> alg(*reinterpret_cast<const Digraph*>(Base::_g));
1007 1003
      if (Base::_pred)
1008 1004
        alg.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
1009 1005
      if (Base::_dist)
1010 1006
        alg.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
1011 1007
      if (Base::_reached)
1012 1008
        alg.reachedMap(*reinterpret_cast<ReachedMap*>(Base::_reached));
1013 1009
      if (Base::_processed)
1014 1010
        alg.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
1015 1011
      if (s!=INVALID)
1016 1012
        alg.run(s);
1017 1013
      else
1018 1014
        alg.run();
1019 1015
    }
1020 1016

	
1021 1017
    ///Finds the shortest path between \c s and \c t.
1022 1018

	
1023 1019
    ///This method runs BFS algorithm from node \c s
1024 1020
    ///in order to compute the shortest path to node \c t
1025 1021
    ///(it stops searching when \c t is processed).
1026 1022
    ///
1027 1023
    ///\return \c true if \c t is reachable form \c s.
1028 1024
    bool run(Node s, Node t)
1029 1025
    {
1030 1026
      Bfs<Digraph,TR> alg(*reinterpret_cast<const Digraph*>(Base::_g));
1031 1027
      if (Base::_pred)
1032 1028
        alg.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
1033 1029
      if (Base::_dist)
1034 1030
        alg.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
1035 1031
      if (Base::_reached)
1036 1032
        alg.reachedMap(*reinterpret_cast<ReachedMap*>(Base::_reached));
1037 1033
      if (Base::_processed)
1038 1034
        alg.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
1039 1035
      alg.run(s,t);
1040 1036
      if (Base::_path)
1041 1037
        *reinterpret_cast<Path*>(Base::_path) = alg.path(t);
1042 1038
      if (Base::_di)
1043 1039
        *Base::_di = alg.dist(t);
1044 1040
      return alg.reached(t);
1045 1041
    }
1046 1042

	
1047 1043
    ///Runs BFS algorithm to visit all nodes in the digraph.
1048 1044

	
1049
    ///This method runs BFS algorithm in order to compute
1050
    ///the shortest path to each node.
1045
    ///This method runs BFS algorithm in order to visit all nodes
1046
    ///in the digraph.
1051 1047
    void run()
1052 1048
    {
1053 1049
      run(INVALID);
1054 1050
    }
1055 1051

	
1056 1052
    template<class T>
1057 1053
    struct SetPredMapBase : public Base {
1058 1054
      typedef T PredMap;
1059 1055
      static PredMap *createPredMap(const Digraph &) { return 0; };
1060 1056
      SetPredMapBase(const TR &b) : TR(b) {}
1061 1057
    };
1062 1058

	
1063 1059
    ///\brief \ref named-templ-param "Named parameter" for setting
1064 1060
    ///the predecessor map.
1065 1061
    ///
1066 1062
    ///\ref named-templ-param "Named parameter" function for setting
1067 1063
    ///the map that stores the predecessor arcs of the nodes.
1068 1064
    template<class T>
1069 1065
    BfsWizard<SetPredMapBase<T> > predMap(const T &t)
1070 1066
    {
1071 1067
      Base::_pred=reinterpret_cast<void*>(const_cast<T*>(&t));
1072 1068
      return BfsWizard<SetPredMapBase<T> >(*this);
1073 1069
    }
1074 1070

	
1075 1071
    template<class T>
1076 1072
    struct SetReachedMapBase : public Base {
1077 1073
      typedef T ReachedMap;
1078 1074
      static ReachedMap *createReachedMap(const Digraph &) { return 0; };
1079 1075
      SetReachedMapBase(const TR &b) : TR(b) {}
1080 1076
    };
1081 1077

	
1082 1078
    ///\brief \ref named-templ-param "Named parameter" for setting
1083 1079
    ///the reached map.
1084 1080
    ///
1085 1081
    ///\ref named-templ-param "Named parameter" function for setting
1086 1082
    ///the map that indicates which nodes are reached.
1087 1083
    template<class T>
1088 1084
    BfsWizard<SetReachedMapBase<T> > reachedMap(const T &t)
1089 1085
    {
1090 1086
      Base::_reached=reinterpret_cast<void*>(const_cast<T*>(&t));
1091 1087
      return BfsWizard<SetReachedMapBase<T> >(*this);
1092 1088
    }
1093 1089

	
1094 1090
    template<class T>
1095 1091
    struct SetDistMapBase : public Base {
1096 1092
      typedef T DistMap;
1097 1093
      static DistMap *createDistMap(const Digraph &) { return 0; };
1098 1094
      SetDistMapBase(const TR &b) : TR(b) {}
1099 1095
    };
1100 1096

	
1101 1097
    ///\brief \ref named-templ-param "Named parameter" for setting
1102 1098
    ///the distance map.
1103 1099
    ///
1104 1100
    ///\ref named-templ-param "Named parameter" function for setting
1105 1101
    ///the map that stores the distances of the nodes calculated
1106 1102
    ///by the algorithm.
1107 1103
    template<class T>
1108 1104
    BfsWizard<SetDistMapBase<T> > distMap(const T &t)
1109 1105
    {
1110 1106
      Base::_dist=reinterpret_cast<void*>(const_cast<T*>(&t));
1111 1107
      return BfsWizard<SetDistMapBase<T> >(*this);
1112 1108
    }
1113 1109

	
1114 1110
    template<class T>
1115 1111
    struct SetProcessedMapBase : public Base {
1116 1112
      typedef T ProcessedMap;
1117 1113
      static ProcessedMap *createProcessedMap(const Digraph &) { return 0; };
1118 1114
      SetProcessedMapBase(const TR &b) : TR(b) {}
1119 1115
    };
1120 1116

	
1121 1117
    ///\brief \ref named-func-param "Named parameter" for setting
1122 1118
    ///the processed map.
1123 1119
    ///
1124 1120
    ///\ref named-templ-param "Named parameter" function for setting
1125 1121
    ///the map that indicates which nodes are processed.
1126 1122
    template<class T>
1127 1123
    BfsWizard<SetProcessedMapBase<T> > processedMap(const T &t)
1128 1124
    {
1129 1125
      Base::_processed=reinterpret_cast<void*>(const_cast<T*>(&t));
1130 1126
      return BfsWizard<SetProcessedMapBase<T> >(*this);
1131 1127
    }
1132 1128

	
1133 1129
    template<class T>
1134 1130
    struct SetPathBase : public Base {
1135 1131
      typedef T Path;
1136 1132
      SetPathBase(const TR &b) : TR(b) {}
1137 1133
    };
1138 1134
    ///\brief \ref named-func-param "Named parameter"
1139 1135
    ///for getting the shortest path to the target node.
1140 1136
    ///
1141 1137
    ///\ref named-func-param "Named parameter"
1142 1138
    ///for getting the shortest path to the target node.
1143 1139
    template<class T>
1144 1140
    BfsWizard<SetPathBase<T> > path(const T &t)
1145 1141
    {
1146 1142
      Base::_path=reinterpret_cast<void*>(const_cast<T*>(&t));
1147 1143
      return BfsWizard<SetPathBase<T> >(*this);
1148 1144
    }
1149 1145

	
1150 1146
    ///\brief \ref named-func-param "Named parameter"
1151 1147
    ///for getting the distance of the target node.
1152 1148
    ///
1153 1149
    ///\ref named-func-param "Named parameter"
1154 1150
    ///for getting the distance of the target node.
1155 1151
    BfsWizard dist(const int &d)
1156 1152
    {
1157 1153
      Base::_di=const_cast<int*>(&d);
1158 1154
      return *this;
1159 1155
    }
1160 1156

	
1161 1157
  };
1162 1158

	
1163 1159
  ///Function-type interface for BFS algorithm.
1164 1160

	
1165 1161
  /// \ingroup search
1166 1162
  ///Function-type interface for BFS algorithm.
1167 1163
  ///
1168 1164
  ///This function also has several \ref named-func-param "named parameters",
1169 1165
  ///they are declared as the members of class \ref BfsWizard.
1170 1166
  ///The following examples show how to use these parameters.
1171 1167
  ///\code
1172 1168
  ///  // Compute shortest path from node s to each node
1173 1169
  ///  bfs(g).predMap(preds).distMap(dists).run(s);
1174 1170
  ///
1175 1171
  ///  // Compute shortest path from s to t
1176 1172
  ///  bool reached = bfs(g).path(p).dist(d).run(s,t);
1177 1173
  ///\endcode
1178 1174
  ///\warning Don't forget to put the \ref BfsWizard::run(Node) "run()"
1179 1175
  ///to the end of the parameter list.
1180 1176
  ///\sa BfsWizard
1181 1177
  ///\sa Bfs
1182 1178
  template<class GR>
1183 1179
  BfsWizard<BfsWizardBase<GR> >
1184 1180
  bfs(const GR &digraph)
1185 1181
  {
1186 1182
    return BfsWizard<BfsWizardBase<GR> >(digraph);
1187 1183
  }
1188 1184

	
1189 1185
#ifdef DOXYGEN
1190 1186
  /// \brief Visitor class for BFS.
1191 1187
  ///
1192 1188
  /// This class defines the interface of the BfsVisit events, and
1193 1189
  /// it could be the base of a real visitor class.
1194 1190
  template <typename GR>
1195 1191
  struct BfsVisitor {
1196 1192
    typedef GR Digraph;
1197 1193
    typedef typename Digraph::Arc Arc;
1198 1194
    typedef typename Digraph::Node Node;
1199 1195
    /// \brief Called for the source node(s) of the BFS.
1200 1196
    ///
1201 1197
    /// This function is called for the source node(s) of the BFS.
1202 1198
    void start(const Node& node) {}
1203 1199
    /// \brief Called when a node is reached first time.
1204 1200
    ///
1205 1201
    /// This function is called when a node is reached first time.
1206 1202
    void reach(const Node& node) {}
1207 1203
    /// \brief Called when a node is processed.
1208 1204
    ///
1209 1205
    /// This function is called when a node is processed.
1210 1206
    void process(const Node& node) {}
1211 1207
    /// \brief Called when an arc reaches a new node.
1212 1208
    ///
1213 1209
    /// This function is called when the BFS finds an arc whose target node
1214 1210
    /// is not reached yet.
1215 1211
    void discover(const Arc& arc) {}
1216 1212
    /// \brief Called when an arc is examined but its target node is
1217 1213
    /// already discovered.
1218 1214
    ///
1219 1215
    /// This function is called when an arc is examined but its target node is
1220 1216
    /// already discovered.
1221 1217
    void examine(const Arc& arc) {}
1222 1218
  };
1223 1219
#else
1224 1220
  template <typename GR>
1225 1221
  struct BfsVisitor {
1226 1222
    typedef GR Digraph;
1227 1223
    typedef typename Digraph::Arc Arc;
1228 1224
    typedef typename Digraph::Node Node;
1229 1225
    void start(const Node&) {}
1230 1226
    void reach(const Node&) {}
1231 1227
    void process(const Node&) {}
1232 1228
    void discover(const Arc&) {}
1233 1229
    void examine(const Arc&) {}
1234 1230

	
1235 1231
    template <typename _Visitor>
1236 1232
    struct Constraints {
1237 1233
      void constraints() {
1238 1234
        Arc arc;
1239 1235
        Node node;
1240 1236
        visitor.start(node);
1241 1237
        visitor.reach(node);
1242 1238
        visitor.process(node);
1243 1239
        visitor.discover(arc);
1244 1240
        visitor.examine(arc);
1245 1241
      }
1246 1242
      _Visitor& visitor;
1247 1243
    };
1248 1244
  };
1249 1245
#endif
1250 1246

	
1251 1247
  /// \brief Default traits class of BfsVisit class.
1252 1248
  ///
1253 1249
  /// Default traits class of BfsVisit class.
1254 1250
  /// \tparam GR The type of the digraph the algorithm runs on.
1255 1251
  template<class GR>
1256 1252
  struct BfsVisitDefaultTraits {
1257 1253

	
1258 1254
    /// \brief The type of the digraph the algorithm runs on.
1259 1255
    typedef GR Digraph;
1260 1256

	
1261 1257
    /// \brief The type of the map that indicates which nodes are reached.
1262 1258
    ///
1263 1259
    /// The type of the map that indicates which nodes are reached.
1264 1260
    /// It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
1265 1261
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
1266 1262

	
1267 1263
    /// \brief Instantiates a ReachedMap.
1268 1264
    ///
1269 1265
    /// This function instantiates a ReachedMap.
1270 1266
    /// \param digraph is the digraph, to which
1271 1267
    /// we would like to define the ReachedMap.
1272 1268
    static ReachedMap *createReachedMap(const Digraph &digraph) {
1273 1269
      return new ReachedMap(digraph);
1274 1270
    }
1275 1271

	
1276 1272
  };
1277 1273

	
1278 1274
  /// \ingroup search
1279 1275
  ///
1280 1276
  /// \brief BFS algorithm class with visitor interface.
1281 1277
  ///
1282 1278
  /// This class provides an efficient implementation of the BFS algorithm
1283 1279
  /// with visitor interface.
1284 1280
  ///
1285 1281
  /// The BfsVisit class provides an alternative interface to the Bfs
1286 1282
  /// class. It works with callback mechanism, the BfsVisit object calls
1287 1283
  /// the member functions of the \c Visitor class on every BFS event.
1288 1284
  ///
1289 1285
  /// This interface of the BFS algorithm should be used in special cases
1290 1286
  /// when extra actions have to be performed in connection with certain
1291 1287
  /// events of the BFS algorithm. Otherwise consider to use Bfs or bfs()
1292 1288
  /// instead.
1293 1289
  ///
1294 1290
  /// \tparam GR The type of the digraph the algorithm runs on.
1295 1291
  /// The default type is \ref ListDigraph.
1296 1292
  /// The value of GR is not used directly by \ref BfsVisit,
1297 1293
  /// it is only passed to \ref BfsVisitDefaultTraits.
1298 1294
  /// \tparam VS The Visitor type that is used by the algorithm.
1299 1295
  /// \ref BfsVisitor "BfsVisitor<GR>" is an empty visitor, which
1300 1296
  /// does not observe the BFS events. If you want to observe the BFS
1301 1297
  /// events, you should implement your own visitor class.
1302 1298
  /// \tparam TR Traits class to set various data types used by the
1303 1299
  /// algorithm. The default traits class is
1304 1300
  /// \ref BfsVisitDefaultTraits "BfsVisitDefaultTraits<GR>".
1305 1301
  /// See \ref BfsVisitDefaultTraits for the documentation of
1306 1302
  /// a BFS visit traits class.
1307 1303
#ifdef DOXYGEN
1308 1304
  template <typename GR, typename VS, typename TR>
1309 1305
#else
1310 1306
  template <typename GR = ListDigraph,
1311 1307
            typename VS = BfsVisitor<GR>,
1312 1308
            typename TR = BfsVisitDefaultTraits<GR> >
1313 1309
#endif
1314 1310
  class BfsVisit {
1315 1311
  public:
1316 1312

	
1317 1313
    ///The traits class.
1318 1314
    typedef TR Traits;
1319 1315

	
1320 1316
    ///The type of the digraph the algorithm runs on.
1321 1317
    typedef typename Traits::Digraph Digraph;
1322 1318

	
1323 1319
    ///The visitor type used by the algorithm.
1324 1320
    typedef VS Visitor;
1325 1321

	
1326 1322
    ///The type of the map that indicates which nodes are reached.
1327 1323
    typedef typename Traits::ReachedMap ReachedMap;
1328 1324

	
1329 1325
  private:
1330 1326

	
1331 1327
    typedef typename Digraph::Node Node;
1332 1328
    typedef typename Digraph::NodeIt NodeIt;
1333 1329
    typedef typename Digraph::Arc Arc;
1334 1330
    typedef typename Digraph::OutArcIt OutArcIt;
1335 1331

	
1336 1332
    //Pointer to the underlying digraph.
1337 1333
    const Digraph *_digraph;
1338 1334
    //Pointer to the visitor object.
1339 1335
    Visitor *_visitor;
1340 1336
    //Pointer to the map of reached status of the nodes.
1341 1337
    ReachedMap *_reached;
1342 1338
    //Indicates if _reached is locally allocated (true) or not.
1343 1339
    bool local_reached;
1344 1340

	
1345 1341
    std::vector<typename Digraph::Node> _list;
1346 1342
    int _list_front, _list_back;
1347 1343

	
1348 1344
    //Creates the maps if necessary.
1349 1345
    void create_maps() {
1350 1346
      if(!_reached) {
1351 1347
        local_reached = true;
1352 1348
        _reached = Traits::createReachedMap(*_digraph);
1353 1349
      }
1354 1350
    }
1355 1351

	
1356 1352
  protected:
1357 1353

	
1358 1354
    BfsVisit() {}
1359 1355

	
1360 1356
  public:
1361 1357

	
1362 1358
    typedef BfsVisit Create;
1363 1359

	
1364 1360
    /// \name Named Template Parameters
1365 1361

	
1366 1362
    ///@{
1367 1363
    template <class T>
1368 1364
    struct SetReachedMapTraits : public Traits {
1369 1365
      typedef T ReachedMap;
1370 1366
      static ReachedMap *createReachedMap(const Digraph &digraph) {
1371 1367
        LEMON_ASSERT(false, "ReachedMap is not initialized");
1372 1368
        return 0; // ignore warnings
1373 1369
      }
1374 1370
    };
1375 1371
    /// \brief \ref named-templ-param "Named parameter" for setting
1376 1372
    /// ReachedMap type.
1377 1373
    ///
1378 1374
    /// \ref named-templ-param "Named parameter" for setting ReachedMap type.
1379 1375
    template <class T>
1380 1376
    struct SetReachedMap : public BfsVisit< Digraph, Visitor,
1381 1377
                                            SetReachedMapTraits<T> > {
1382 1378
      typedef BfsVisit< Digraph, Visitor, SetReachedMapTraits<T> > Create;
1383 1379
    };
1384 1380
    ///@}
1385 1381

	
1386 1382
  public:
1387 1383

	
1388 1384
    /// \brief Constructor.
1389 1385
    ///
1390 1386
    /// Constructor.
1391 1387
    ///
1392 1388
    /// \param digraph The digraph the algorithm runs on.
1393 1389
    /// \param visitor The visitor object of the algorithm.
1394 1390
    BfsVisit(const Digraph& digraph, Visitor& visitor)
1395 1391
      : _digraph(&digraph), _visitor(&visitor),
1396 1392
        _reached(0), local_reached(false) {}
1397 1393

	
1398 1394
    /// \brief Destructor.
1399 1395
    ~BfsVisit() {
1400 1396
      if(local_reached) delete _reached;
1401 1397
    }
1402 1398

	
1403 1399
    /// \brief Sets the map that indicates which nodes are reached.
1404 1400
    ///
1405 1401
    /// Sets the map that indicates which nodes are reached.
1406 1402
    /// If you don't use this function before calling \ref run(Node) "run()"
1407 1403
    /// or \ref init(), an instance will be allocated automatically.
1408 1404
    /// The destructor deallocates this automatically allocated map,
1409 1405
    /// of course.
1410 1406
    /// \return <tt> (*this) </tt>
1411 1407
    BfsVisit &reachedMap(ReachedMap &m) {
1412 1408
      if(local_reached) {
1413 1409
        delete _reached;
1414 1410
        local_reached = false;
1415 1411
      }
1416 1412
      _reached = &m;
1417 1413
      return *this;
1418 1414
    }
1419 1415

	
1420 1416
  public:
1421 1417

	
1422 1418
    /// \name Execution Control
1423 1419
    /// The simplest way to execute the BFS algorithm is to use one of the
1424 1420
    /// member functions called \ref run(Node) "run()".\n
1425 1421
    /// If you need better control on the execution, you have to call
1426 1422
    /// \ref init() first, then you can add several source nodes with
1427 1423
    /// \ref addSource(). Finally the actual path computation can be
1428 1424
    /// performed with one of the \ref start() functions.
1429 1425

	
1430 1426
    /// @{
1431 1427

	
1432 1428
    /// \brief Initializes the internal data structures.
1433 1429
    ///
1434 1430
    /// Initializes the internal data structures.
1435 1431
    void init() {
1436 1432
      create_maps();
1437 1433
      _list.resize(countNodes(*_digraph));
1438 1434
      _list_front = _list_back = -1;
1439 1435
      for (NodeIt u(*_digraph) ; u != INVALID ; ++u) {
1440 1436
        _reached->set(u, false);
1441 1437
      }
1442 1438
    }
1443 1439

	
1444 1440
    /// \brief Adds a new source node.
1445 1441
    ///
1446 1442
    /// Adds a new source node to the set of nodes to be processed.
1447 1443
    void addSource(Node s) {
1448 1444
      if(!(*_reached)[s]) {
1449 1445
          _reached->set(s,true);
1450 1446
          _visitor->start(s);
1451 1447
          _visitor->reach(s);
1452 1448
          _list[++_list_back] = s;
1453 1449
        }
1454 1450
    }
1455 1451

	
1456 1452
    /// \brief Processes the next node.
1457 1453
    ///
1458 1454
    /// Processes the next node.
1459 1455
    ///
1460 1456
    /// \return The processed node.
1461 1457
    ///
1462 1458
    /// \pre The queue must not be empty.
1463 1459
    Node processNextNode() {
1464 1460
      Node n = _list[++_list_front];
1465 1461
      _visitor->process(n);
1466 1462
      Arc e;
1467 1463
      for (_digraph->firstOut(e, n); e != INVALID; _digraph->nextOut(e)) {
1468 1464
        Node m = _digraph->target(e);
1469 1465
        if (!(*_reached)[m]) {
1470 1466
          _visitor->discover(e);
1471 1467
          _visitor->reach(m);
1472 1468
          _reached->set(m, true);
1473 1469
          _list[++_list_back] = m;
1474 1470
        } else {
1475 1471
          _visitor->examine(e);
1476 1472
        }
1477 1473
      }
1478 1474
      return n;
1479 1475
    }
1480 1476

	
1481 1477
    /// \brief Processes the next node.
1482 1478
    ///
1483 1479
    /// Processes the next node and checks if the given target node
1484 1480
    /// is reached. If the target node is reachable from the processed
1485 1481
    /// node, then the \c reach parameter will be set to \c true.
1486 1482
    ///
1487 1483
    /// \param target The target node.
1488 1484
    /// \retval reach Indicates if the target node is reached.
1489 1485
    /// It should be initially \c false.
1490 1486
    ///
1491 1487
    /// \return The processed node.
1492 1488
    ///
1493 1489
    /// \pre The queue must not be empty.
1494 1490
    Node processNextNode(Node target, bool& reach) {
1495 1491
      Node n = _list[++_list_front];
1496 1492
      _visitor->process(n);
1497 1493
      Arc e;
1498 1494
      for (_digraph->firstOut(e, n); e != INVALID; _digraph->nextOut(e)) {
1499 1495
        Node m = _digraph->target(e);
1500 1496
        if (!(*_reached)[m]) {
1501 1497
          _visitor->discover(e);
1502 1498
          _visitor->reach(m);
1503 1499
          _reached->set(m, true);
1504 1500
          _list[++_list_back] = m;
1505 1501
          reach = reach || (target == m);
1506 1502
        } else {
1507 1503
          _visitor->examine(e);
1508 1504
        }
1509 1505
      }
1510 1506
      return n;
1511 1507
    }
1512 1508

	
1513 1509
    /// \brief Processes the next node.
1514 1510
    ///
1515 1511
    /// Processes the next node and checks if at least one of reached
1516 1512
    /// nodes has \c true value in the \c nm node map. If one node
1517 1513
    /// with \c true value is reachable from the processed node, then the
1518 1514
    /// \c rnode parameter will be set to the first of such nodes.
1519 1515
    ///
1520 1516
    /// \param nm A \c bool (or convertible) node map that indicates the
1521 1517
    /// possible targets.
1522 1518
    /// \retval rnode The reached target node.
1523 1519
    /// It should be initially \c INVALID.
1524 1520
    ///
1525 1521
    /// \return The processed node.
1526 1522
    ///
1527 1523
    /// \pre The queue must not be empty.
1528 1524
    template <typename NM>
1529 1525
    Node processNextNode(const NM& nm, Node& rnode) {
1530 1526
      Node n = _list[++_list_front];
1531 1527
      _visitor->process(n);
1532 1528
      Arc e;
1533 1529
      for (_digraph->firstOut(e, n); e != INVALID; _digraph->nextOut(e)) {
1534 1530
        Node m = _digraph->target(e);
1535 1531
        if (!(*_reached)[m]) {
1536 1532
          _visitor->discover(e);
1537 1533
          _visitor->reach(m);
1538 1534
          _reached->set(m, true);
1539 1535
          _list[++_list_back] = m;
1540 1536
          if (nm[m] && rnode == INVALID) rnode = m;
1541 1537
        } else {
1542 1538
          _visitor->examine(e);
1543 1539
        }
1544 1540
      }
1545 1541
      return n;
1546 1542
    }
1547 1543

	
1548 1544
    /// \brief The next node to be processed.
1549 1545
    ///
1550 1546
    /// Returns the next node to be processed or \c INVALID if the queue
1551 1547
    /// is empty.
1552 1548
    Node nextNode() const {
1553 1549
      return _list_front != _list_back ? _list[_list_front + 1] : INVALID;
1554 1550
    }
1555 1551

	
1556 1552
    /// \brief Returns \c false if there are nodes
1557 1553
    /// to be processed.
1558 1554
    ///
1559 1555
    /// Returns \c false if there are nodes
1560 1556
    /// to be processed in the queue.
1561 1557
    bool emptyQueue() const { return _list_front == _list_back; }
1562 1558

	
1563 1559
    /// \brief Returns the number of the nodes to be processed.
1564 1560
    ///
1565 1561
    /// Returns the number of the nodes to be processed in the queue.
1566 1562
    int queueSize() const { return _list_back - _list_front; }
1567 1563

	
1568 1564
    /// \brief Executes the algorithm.
1569 1565
    ///
1570 1566
    /// Executes the algorithm.
1571 1567
    ///
1572 1568
    /// This method runs the %BFS algorithm from the root node(s)
1573 1569
    /// in order to compute the shortest path to each node.
1574 1570
    ///
1575 1571
    /// The algorithm computes
1576 1572
    /// - the shortest path tree (forest),
1577 1573
    /// - the distance of each node from the root(s).
1578 1574
    ///
1579 1575
    /// \pre init() must be called and at least one root node should be added
1580 1576
    /// with addSource() before using this function.
1581 1577
    ///
1582 1578
    /// \note <tt>b.start()</tt> is just a shortcut of the following code.
1583 1579
    /// \code
1584 1580
    ///   while ( !b.emptyQueue() ) {
1585 1581
    ///     b.processNextNode();
1586 1582
    ///   }
1587 1583
    /// \endcode
1588 1584
    void start() {
1589 1585
      while ( !emptyQueue() ) processNextNode();
1590 1586
    }
1591 1587

	
1592 1588
    /// \brief Executes the algorithm until the given target node is reached.
1593 1589
    ///
1594 1590
    /// Executes the algorithm until the given target node is reached.
1595 1591
    ///
1596 1592
    /// This method runs the %BFS algorithm from the root node(s)
1597 1593
    /// in order to compute the shortest path to \c t.
1598 1594
    ///
1599 1595
    /// The algorithm computes
1600 1596
    /// - the shortest path to \c t,
1601 1597
    /// - the distance of \c t from the root(s).
1602 1598
    ///
1603 1599
    /// \pre init() must be called and at least one root node should be
1604 1600
    /// added with addSource() before using this function.
1605 1601
    ///
1606 1602
    /// \note <tt>b.start(t)</tt> is just a shortcut of the following code.
1607 1603
    /// \code
1608 1604
    ///   bool reach = false;
1609 1605
    ///   while ( !b.emptyQueue() && !reach ) {
1610 1606
    ///     b.processNextNode(t, reach);
1611 1607
    ///   }
1612 1608
    /// \endcode
1613 1609
    void start(Node t) {
1614 1610
      bool reach = false;
1615 1611
      while ( !emptyQueue() && !reach ) processNextNode(t, reach);
1616 1612
    }
1617 1613

	
1618 1614
    /// \brief Executes the algorithm until a condition is met.
1619 1615
    ///
1620 1616
    /// Executes the algorithm until a condition is met.
1621 1617
    ///
1622 1618
    /// This method runs the %BFS algorithm from the root node(s) in
1623 1619
    /// order to compute the shortest path to a node \c v with
1624 1620
    /// <tt>nm[v]</tt> true, if such a node can be found.
1625 1621
    ///
1626 1622
    /// \param nm must be a bool (or convertible) node map. The
1627 1623
    /// algorithm will stop when it reaches a node \c v with
1628 1624
    /// <tt>nm[v]</tt> true.
1629 1625
    ///
1630 1626
    /// \return The reached node \c v with <tt>nm[v]</tt> true or
1631 1627
    /// \c INVALID if no such node was found.
1632 1628
    ///
1633 1629
    /// \pre init() must be called and at least one root node should be
1634 1630
    /// added with addSource() before using this function.
1635 1631
    ///
1636 1632
    /// \note <tt>b.start(nm)</tt> is just a shortcut of the following code.
1637 1633
    /// \code
1638 1634
    ///   Node rnode = INVALID;
1639 1635
    ///   while ( !b.emptyQueue() && rnode == INVALID ) {
1640 1636
    ///     b.processNextNode(nm, rnode);
1641 1637
    ///   }
1642 1638
    ///   return rnode;
1643 1639
    /// \endcode
1644 1640
    template <typename NM>
1645 1641
    Node start(const NM &nm) {
1646 1642
      Node rnode = INVALID;
1647 1643
      while ( !emptyQueue() && rnode == INVALID ) {
1648 1644
        processNextNode(nm, rnode);
1649 1645
      }
1650 1646
      return rnode;
1651 1647
    }
1652 1648

	
1653 1649
    /// \brief Runs the algorithm from the given source node.
1654 1650
    ///
1655 1651
    /// This method runs the %BFS algorithm from node \c s
1656 1652
    /// in order to compute the shortest path to each node.
1657 1653
    ///
1658 1654
    /// The algorithm computes
1659 1655
    /// - the shortest path tree,
1660 1656
    /// - the distance of each node from the root.
1661 1657
    ///
1662 1658
    /// \note <tt>b.run(s)</tt> is just a shortcut of the following code.
1663 1659
    ///\code
1664 1660
    ///   b.init();
1665 1661
    ///   b.addSource(s);
1666 1662
    ///   b.start();
1667 1663
    ///\endcode
1668 1664
    void run(Node s) {
1669 1665
      init();
1670 1666
      addSource(s);
1671 1667
      start();
1672 1668
    }
1673 1669

	
1674 1670
    /// \brief Finds the shortest path between \c s and \c t.
1675 1671
    ///
1676 1672
    /// This method runs the %BFS algorithm from node \c s
1677 1673
    /// in order to compute the shortest path to node \c t
1678 1674
    /// (it stops searching when \c t is processed).
1679 1675
    ///
1680 1676
    /// \return \c true if \c t is reachable form \c s.
1681 1677
    ///
1682 1678
    /// \note Apart from the return value, <tt>b.run(s,t)</tt> is just a
1683 1679
    /// shortcut of the following code.
1684 1680
    ///\code
1685 1681
    ///   b.init();
1686 1682
    ///   b.addSource(s);
1687 1683
    ///   b.start(t);
1688 1684
    ///\endcode
1689 1685
    bool run(Node s,Node t) {
1690 1686
      init();
1691 1687
      addSource(s);
1692 1688
      start(t);
1693 1689
      return reached(t);
1694 1690
    }
1695 1691

	
1696 1692
    /// \brief Runs the algorithm to visit all nodes in the digraph.
1697 1693
    ///
1698
    /// This method runs the %BFS algorithm in order to
1699
    /// compute the shortest path to each node.
1700
    ///
1701
    /// The algorithm computes
1702
    /// - the shortest path tree (forest),
1703
    /// - the distance of each node from the root(s).
1694
    /// This method runs the %BFS algorithm in order to visit all nodes
1695
    /// in the digraph.
1704 1696
    ///
1705 1697
    /// \note <tt>b.run(s)</tt> is just a shortcut of the following code.
1706 1698
    ///\code
1707 1699
    ///  b.init();
1708 1700
    ///  for (NodeIt n(gr); n != INVALID; ++n) {
1709 1701
    ///    if (!b.reached(n)) {
1710 1702
    ///      b.addSource(n);
1711 1703
    ///      b.start();
1712 1704
    ///    }
1713 1705
    ///  }
1714 1706
    ///\endcode
1715 1707
    void run() {
1716 1708
      init();
1717 1709
      for (NodeIt it(*_digraph); it != INVALID; ++it) {
1718 1710
        if (!reached(it)) {
1719 1711
          addSource(it);
1720 1712
          start();
1721 1713
        }
1722 1714
      }
1723 1715
    }
1724 1716

	
1725 1717
    ///@}
1726 1718

	
1727 1719
    /// \name Query Functions
1728 1720
    /// The results of the BFS algorithm can be obtained using these
1729 1721
    /// functions.\n
1730 1722
    /// Either \ref run(Node) "run()" or \ref start() should be called
1731 1723
    /// before using them.
1732 1724

	
1733 1725
    ///@{
1734 1726

	
1735 1727
    /// \brief Checks if the given node is reached from the root(s).
1736 1728
    ///
1737 1729
    /// Returns \c true if \c v is reached from the root(s).
1738 1730
    ///
1739 1731
    /// \pre Either \ref run(Node) "run()" or \ref init()
1740 1732
    /// must be called before using this function.
1741 1733
    bool reached(Node v) const { return (*_reached)[v]; }
1742 1734

	
1743 1735
    ///@}
1744 1736

	
1745 1737
  };
1746 1738

	
1747 1739
} //END OF NAMESPACE LEMON
1748 1740

	
1749 1741
#endif
Ignore white space 1536 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5 5
 * Copyright (C) 2003-2009
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_DFS_H
20 20
#define LEMON_DFS_H
21 21

	
22 22
///\ingroup search
23 23
///\file
24 24
///\brief DFS algorithm.
25 25

	
26 26
#include <lemon/list_graph.h>
27 27
#include <lemon/bits/path_dump.h>
28 28
#include <lemon/core.h>
29 29
#include <lemon/error.h>
30 30
#include <lemon/maps.h>
31 31
#include <lemon/path.h>
32 32

	
33 33
namespace lemon {
34 34

	
35 35
  ///Default traits class of Dfs class.
36 36

	
37 37
  ///Default traits class of Dfs class.
38 38
  ///\tparam GR Digraph type.
39 39
  template<class GR>
40 40
  struct DfsDefaultTraits
41 41
  {
42 42
    ///The type of the digraph the algorithm runs on.
43 43
    typedef GR Digraph;
44 44

	
45 45
    ///\brief The type of the map that stores the predecessor
46 46
    ///arcs of the %DFS paths.
47 47
    ///
48 48
    ///The type of the map that stores the predecessor
49 49
    ///arcs of the %DFS paths.
50 50
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
51 51
    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
52 52
    ///Instantiates a \c PredMap.
53 53

	
54 54
    ///This function instantiates a \ref PredMap.
55 55
    ///\param g is the digraph, to which we would like to define the
56 56
    ///\ref PredMap.
57 57
    static PredMap *createPredMap(const Digraph &g)
58 58
    {
59 59
      return new PredMap(g);
60 60
    }
61 61

	
62 62
    ///The type of the map that indicates which nodes are processed.
63 63

	
64 64
    ///The type of the map that indicates which nodes are processed.
65 65
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
66 66
    ///By default it is a NullMap.
67 67
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
68 68
    ///Instantiates a \c ProcessedMap.
69 69

	
70 70
    ///This function instantiates a \ref ProcessedMap.
71 71
    ///\param g is the digraph, to which
72 72
    ///we would like to define the \ref ProcessedMap.
73 73
#ifdef DOXYGEN
74 74
    static ProcessedMap *createProcessedMap(const Digraph &g)
75 75
#else
76 76
    static ProcessedMap *createProcessedMap(const Digraph &)
77 77
#endif
78 78
    {
79 79
      return new ProcessedMap();
80 80
    }
81 81

	
82 82
    ///The type of the map that indicates which nodes are reached.
83 83

	
84 84
    ///The type of the map that indicates which nodes are reached.
85 85
    ///It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
86 86
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
87 87
    ///Instantiates a \c ReachedMap.
88 88

	
89 89
    ///This function instantiates a \ref ReachedMap.
90 90
    ///\param g is the digraph, to which
91 91
    ///we would like to define the \ref ReachedMap.
92 92
    static ReachedMap *createReachedMap(const Digraph &g)
93 93
    {
94 94
      return new ReachedMap(g);
95 95
    }
96 96

	
97 97
    ///The type of the map that stores the distances of the nodes.
98 98

	
99 99
    ///The type of the map that stores the distances of the nodes.
100 100
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
101 101
    typedef typename Digraph::template NodeMap<int> DistMap;
102 102
    ///Instantiates a \c DistMap.
103 103

	
104 104
    ///This function instantiates a \ref DistMap.
105 105
    ///\param g is the digraph, to which we would like to define the
106 106
    ///\ref DistMap.
107 107
    static DistMap *createDistMap(const Digraph &g)
108 108
    {
109 109
      return new DistMap(g);
110 110
    }
111 111
  };
112 112

	
113 113
  ///%DFS algorithm class.
114 114

	
115 115
  ///\ingroup search
116 116
  ///This class provides an efficient implementation of the %DFS algorithm.
117 117
  ///
118 118
  ///There is also a \ref dfs() "function-type interface" for the DFS
119 119
  ///algorithm, which is convenient in the simplier cases and it can be
120 120
  ///used easier.
121 121
  ///
122 122
  ///\tparam GR The type of the digraph the algorithm runs on.
123 123
  ///The default type is \ref ListDigraph.
124 124
#ifdef DOXYGEN
125 125
  template <typename GR,
126 126
            typename TR>
127 127
#else
128 128
  template <typename GR=ListDigraph,
129 129
            typename TR=DfsDefaultTraits<GR> >
130 130
#endif
131 131
  class Dfs {
132 132
  public:
133 133

	
134 134
    ///The type of the digraph the algorithm runs on.
135 135
    typedef typename TR::Digraph Digraph;
136 136

	
137 137
    ///\brief The type of the map that stores the predecessor arcs of the
138 138
    ///DFS paths.
139 139
    typedef typename TR::PredMap PredMap;
140 140
    ///The type of the map that stores the distances of the nodes.
141 141
    typedef typename TR::DistMap DistMap;
142 142
    ///The type of the map that indicates which nodes are reached.
143 143
    typedef typename TR::ReachedMap ReachedMap;
144 144
    ///The type of the map that indicates which nodes are processed.
145 145
    typedef typename TR::ProcessedMap ProcessedMap;
146 146
    ///The type of the paths.
147 147
    typedef PredMapPath<Digraph, PredMap> Path;
148 148

	
149 149
    ///The \ref DfsDefaultTraits "traits class" of the algorithm.
150 150
    typedef TR Traits;
151 151

	
152 152
  private:
153 153

	
154 154
    typedef typename Digraph::Node Node;
155 155
    typedef typename Digraph::NodeIt NodeIt;
156 156
    typedef typename Digraph::Arc Arc;
157 157
    typedef typename Digraph::OutArcIt OutArcIt;
158 158

	
159 159
    //Pointer to the underlying digraph.
160 160
    const Digraph *G;
161 161
    //Pointer to the map of predecessor arcs.
162 162
    PredMap *_pred;
163 163
    //Indicates if _pred is locally allocated (true) or not.
164 164
    bool local_pred;
165 165
    //Pointer to the map of distances.
166 166
    DistMap *_dist;
167 167
    //Indicates if _dist is locally allocated (true) or not.
168 168
    bool local_dist;
169 169
    //Pointer to the map of reached status of the nodes.
170 170
    ReachedMap *_reached;
171 171
    //Indicates if _reached is locally allocated (true) or not.
172 172
    bool local_reached;
173 173
    //Pointer to the map of processed status of the nodes.
174 174
    ProcessedMap *_processed;
175 175
    //Indicates if _processed is locally allocated (true) or not.
176 176
    bool local_processed;
177 177

	
178 178
    std::vector<typename Digraph::OutArcIt> _stack;
179 179
    int _stack_head;
180 180

	
181 181
    //Creates the maps if necessary.
182 182
    void create_maps()
183 183
    {
184 184
      if(!_pred) {
185 185
        local_pred = true;
186 186
        _pred = Traits::createPredMap(*G);
187 187
      }
188 188
      if(!_dist) {
189 189
        local_dist = true;
190 190
        _dist = Traits::createDistMap(*G);
191 191
      }
192 192
      if(!_reached) {
193 193
        local_reached = true;
194 194
        _reached = Traits::createReachedMap(*G);
195 195
      }
196 196
      if(!_processed) {
197 197
        local_processed = true;
198 198
        _processed = Traits::createProcessedMap(*G);
199 199
      }
200 200
    }
201 201

	
202 202
  protected:
203 203

	
204 204
    Dfs() {}
205 205

	
206 206
  public:
207 207

	
208 208
    typedef Dfs Create;
209 209

	
210 210
    ///\name Named Template Parameters
211 211

	
212 212
    ///@{
213 213

	
214 214
    template <class T>
215 215
    struct SetPredMapTraits : public Traits {
216 216
      typedef T PredMap;
217 217
      static PredMap *createPredMap(const Digraph &)
218 218
      {
219 219
        LEMON_ASSERT(false, "PredMap is not initialized");
220 220
        return 0; // ignore warnings
221 221
      }
222 222
    };
223 223
    ///\brief \ref named-templ-param "Named parameter" for setting
224 224
    ///\c PredMap type.
225 225
    ///
226 226
    ///\ref named-templ-param "Named parameter" for setting
227 227
    ///\c PredMap type.
228 228
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
229 229
    template <class T>
230 230
    struct SetPredMap : public Dfs<Digraph, SetPredMapTraits<T> > {
231 231
      typedef Dfs<Digraph, SetPredMapTraits<T> > Create;
232 232
    };
233 233

	
234 234
    template <class T>
235 235
    struct SetDistMapTraits : public Traits {
236 236
      typedef T DistMap;
237 237
      static DistMap *createDistMap(const Digraph &)
238 238
      {
239 239
        LEMON_ASSERT(false, "DistMap is not initialized");
240 240
        return 0; // ignore warnings
241 241
      }
242 242
    };
243 243
    ///\brief \ref named-templ-param "Named parameter" for setting
244 244
    ///\c DistMap type.
245 245
    ///
246 246
    ///\ref named-templ-param "Named parameter" for setting
247 247
    ///\c DistMap type.
248 248
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
249 249
    template <class T>
250 250
    struct SetDistMap : public Dfs< Digraph, SetDistMapTraits<T> > {
251 251
      typedef Dfs<Digraph, SetDistMapTraits<T> > Create;
252 252
    };
253 253

	
254 254
    template <class T>
255 255
    struct SetReachedMapTraits : public Traits {
256 256
      typedef T ReachedMap;
257 257
      static ReachedMap *createReachedMap(const Digraph &)
258 258
      {
259 259
        LEMON_ASSERT(false, "ReachedMap is not initialized");
260 260
        return 0; // ignore warnings
261 261
      }
262 262
    };
263 263
    ///\brief \ref named-templ-param "Named parameter" for setting
264 264
    ///\c ReachedMap type.
265 265
    ///
266 266
    ///\ref named-templ-param "Named parameter" for setting
267 267
    ///\c ReachedMap type.
268 268
    ///It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
269 269
    template <class T>
270 270
    struct SetReachedMap : public Dfs< Digraph, SetReachedMapTraits<T> > {
271 271
      typedef Dfs< Digraph, SetReachedMapTraits<T> > Create;
272 272
    };
273 273

	
274 274
    template <class T>
275 275
    struct SetProcessedMapTraits : public Traits {
276 276
      typedef T ProcessedMap;
277 277
      static ProcessedMap *createProcessedMap(const Digraph &)
278 278
      {
279 279
        LEMON_ASSERT(false, "ProcessedMap is not initialized");
280 280
        return 0; // ignore warnings
281 281
      }
282 282
    };
283 283
    ///\brief \ref named-templ-param "Named parameter" for setting
284 284
    ///\c ProcessedMap type.
285 285
    ///
286 286
    ///\ref named-templ-param "Named parameter" for setting
287 287
    ///\c ProcessedMap type.
288 288
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
289 289
    template <class T>
290 290
    struct SetProcessedMap : public Dfs< Digraph, SetProcessedMapTraits<T> > {
291 291
      typedef Dfs< Digraph, SetProcessedMapTraits<T> > Create;
292 292
    };
293 293

	
294 294
    struct SetStandardProcessedMapTraits : public Traits {
295 295
      typedef typename Digraph::template NodeMap<bool> ProcessedMap;
296 296
      static ProcessedMap *createProcessedMap(const Digraph &g)
297 297
      {
298 298
        return new ProcessedMap(g);
299 299
      }
300 300
    };
301 301
    ///\brief \ref named-templ-param "Named parameter" for setting
302 302
    ///\c ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
303 303
    ///
304 304
    ///\ref named-templ-param "Named parameter" for setting
305 305
    ///\c ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
306 306
    ///If you don't set it explicitly, it will be automatically allocated.
307 307
    struct SetStandardProcessedMap :
308 308
      public Dfs< Digraph, SetStandardProcessedMapTraits > {
309 309
      typedef Dfs< Digraph, SetStandardProcessedMapTraits > Create;
310 310
    };
311 311

	
312 312
    ///@}
313 313

	
314 314
  public:
315 315

	
316 316
    ///Constructor.
317 317

	
318 318
    ///Constructor.
319 319
    ///\param g The digraph the algorithm runs on.
320 320
    Dfs(const Digraph &g) :
321 321
      G(&g),
322 322
      _pred(NULL), local_pred(false),
323 323
      _dist(NULL), local_dist(false),
324 324
      _reached(NULL), local_reached(false),
325 325
      _processed(NULL), local_processed(false)
326 326
    { }
327 327

	
328 328
    ///Destructor.
329 329
    ~Dfs()
330 330
    {
331 331
      if(local_pred) delete _pred;
332 332
      if(local_dist) delete _dist;
333 333
      if(local_reached) delete _reached;
334 334
      if(local_processed) delete _processed;
335 335
    }
336 336

	
337 337
    ///Sets the map that stores the predecessor arcs.
338 338

	
339 339
    ///Sets the map that stores the predecessor arcs.
340 340
    ///If you don't use this function before calling \ref run(Node) "run()"
341 341
    ///or \ref init(), an instance will be allocated automatically.
342 342
    ///The destructor deallocates this automatically allocated map,
343 343
    ///of course.
344 344
    ///\return <tt> (*this) </tt>
345 345
    Dfs &predMap(PredMap &m)
346 346
    {
347 347
      if(local_pred) {
348 348
        delete _pred;
349 349
        local_pred=false;
350 350
      }
351 351
      _pred = &m;
352 352
      return *this;
353 353
    }
354 354

	
355 355
    ///Sets the map that indicates which nodes are reached.
356 356

	
357 357
    ///Sets the map that indicates which nodes are reached.
358 358
    ///If you don't use this function before calling \ref run(Node) "run()"
359 359
    ///or \ref init(), an instance will be allocated automatically.
360 360
    ///The destructor deallocates this automatically allocated map,
361 361
    ///of course.
362 362
    ///\return <tt> (*this) </tt>
363 363
    Dfs &reachedMap(ReachedMap &m)
364 364
    {
365 365
      if(local_reached) {
366 366
        delete _reached;
367 367
        local_reached=false;
368 368
      }
369 369
      _reached = &m;
370 370
      return *this;
371 371
    }
372 372

	
373 373
    ///Sets the map that indicates which nodes are processed.
374 374

	
375 375
    ///Sets the map that indicates which nodes are processed.
376 376
    ///If you don't use this function before calling \ref run(Node) "run()"
377 377
    ///or \ref init(), an instance will be allocated automatically.
378 378
    ///The destructor deallocates this automatically allocated map,
379 379
    ///of course.
380 380
    ///\return <tt> (*this) </tt>
381 381
    Dfs &processedMap(ProcessedMap &m)
382 382
    {
383 383
      if(local_processed) {
384 384
        delete _processed;
385 385
        local_processed=false;
386 386
      }
387 387
      _processed = &m;
388 388
      return *this;
389 389
    }
390 390

	
391 391
    ///Sets the map that stores the distances of the nodes.
392 392

	
393 393
    ///Sets the map that stores the distances of the nodes calculated by
394 394
    ///the algorithm.
395 395
    ///If you don't use this function before calling \ref run(Node) "run()"
396 396
    ///or \ref init(), an instance will be allocated automatically.
397 397
    ///The destructor deallocates this automatically allocated map,
398 398
    ///of course.
399 399
    ///\return <tt> (*this) </tt>
400 400
    Dfs &distMap(DistMap &m)
401 401
    {
402 402
      if(local_dist) {
403 403
        delete _dist;
404 404
        local_dist=false;
405 405
      }
406 406
      _dist = &m;
407 407
      return *this;
408 408
    }
409 409

	
410 410
  public:
411 411

	
412 412
    ///\name Execution Control
413 413
    ///The simplest way to execute the DFS algorithm is to use one of the
414 414
    ///member functions called \ref run(Node) "run()".\n
415 415
    ///If you need better control on the execution, you have to call
416 416
    ///\ref init() first, then you can add a source node with \ref addSource()
417 417
    ///and perform the actual computation with \ref start().
418 418
    ///This procedure can be repeated if there are nodes that have not
419 419
    ///been reached.
420 420

	
421 421
    ///@{
422 422

	
423 423
    ///\brief Initializes the internal data structures.
424 424
    ///
425 425
    ///Initializes the internal data structures.
426 426
    void init()
427 427
    {
428 428
      create_maps();
429 429
      _stack.resize(countNodes(*G));
430 430
      _stack_head=-1;
431 431
      for ( NodeIt u(*G) ; u!=INVALID ; ++u ) {
432 432
        _pred->set(u,INVALID);
433 433
        _reached->set(u,false);
434 434
        _processed->set(u,false);
435 435
      }
436 436
    }
437 437

	
438 438
    ///Adds a new source node.
439 439

	
440 440
    ///Adds a new source node to the set of nodes to be processed.
441 441
    ///
442 442
    ///\pre The stack must be empty. Otherwise the algorithm gives
443 443
    ///wrong results. (One of the outgoing arcs of all the source nodes
444 444
    ///except for the last one will not be visited and distances will
445 445
    ///also be wrong.)
446 446
    void addSource(Node s)
447 447
    {
448 448
      LEMON_DEBUG(emptyQueue(), "The stack is not empty.");
449 449
      if(!(*_reached)[s])
450 450
        {
451 451
          _reached->set(s,true);
452 452
          _pred->set(s,INVALID);
453 453
          OutArcIt e(*G,s);
454 454
          if(e!=INVALID) {
455 455
            _stack[++_stack_head]=e;
456 456
            _dist->set(s,_stack_head);
457 457
          }
458 458
          else {
459 459
            _processed->set(s,true);
460 460
            _dist->set(s,0);
461 461
          }
462 462
        }
463 463
    }
464 464

	
465 465
    ///Processes the next arc.
466 466

	
467 467
    ///Processes the next arc.
468 468
    ///
469 469
    ///\return The processed arc.
470 470
    ///
471 471
    ///\pre The stack must not be empty.
472 472
    Arc processNextArc()
473 473
    {
474 474
      Node m;
475 475
      Arc e=_stack[_stack_head];
476 476
      if(!(*_reached)[m=G->target(e)]) {
477 477
        _pred->set(m,e);
478 478
        _reached->set(m,true);
479 479
        ++_stack_head;
480 480
        _stack[_stack_head] = OutArcIt(*G, m);
481 481
        _dist->set(m,_stack_head);
482 482
      }
483 483
      else {
484 484
        m=G->source(e);
485 485
        ++_stack[_stack_head];
486 486
      }
487 487
      while(_stack_head>=0 && _stack[_stack_head]==INVALID) {
488 488
        _processed->set(m,true);
489 489
        --_stack_head;
490 490
        if(_stack_head>=0) {
491 491
          m=G->source(_stack[_stack_head]);
492 492
          ++_stack[_stack_head];
493 493
        }
494 494
      }
495 495
      return e;
496 496
    }
497 497

	
498 498
    ///Next arc to be processed.
499 499

	
500 500
    ///Next arc to be processed.
501 501
    ///
502 502
    ///\return The next arc to be processed or \c INVALID if the stack
503 503
    ///is empty.
504 504
    OutArcIt nextArc() const
505 505
    {
506 506
      return _stack_head>=0?_stack[_stack_head]:INVALID;
507 507
    }
508 508

	
509 509
    ///Returns \c false if there are nodes to be processed.
510 510

	
511 511
    ///Returns \c false if there are nodes to be processed
512 512
    ///in the queue (stack).
513 513
    bool emptyQueue() const { return _stack_head<0; }
514 514

	
515 515
    ///Returns the number of the nodes to be processed.
516 516

	
517 517
    ///Returns the number of the nodes to be processed
518 518
    ///in the queue (stack).
519 519
    int queueSize() const { return _stack_head+1; }
520 520

	
521 521
    ///Executes the algorithm.
522 522

	
523 523
    ///Executes the algorithm.
524 524
    ///
525 525
    ///This method runs the %DFS algorithm from the root node
526 526
    ///in order to compute the DFS path to each node.
527 527
    ///
528 528
    /// The algorithm computes
529 529
    ///- the %DFS tree,
530 530
    ///- the distance of each node from the root in the %DFS tree.
531 531
    ///
532 532
    ///\pre init() must be called and a root node should be
533 533
    ///added with addSource() before using this function.
534 534
    ///
535 535
    ///\note <tt>d.start()</tt> is just a shortcut of the following code.
536 536
    ///\code
537 537
    ///  while ( !d.emptyQueue() ) {
538 538
    ///    d.processNextArc();
539 539
    ///  }
540 540
    ///\endcode
541 541
    void start()
542 542
    {
543 543
      while ( !emptyQueue() ) processNextArc();
544 544
    }
545 545

	
546 546
    ///Executes the algorithm until the given target node is reached.
547 547

	
548 548
    ///Executes the algorithm until the given target node is reached.
549 549
    ///
550 550
    ///This method runs the %DFS algorithm from the root node
551 551
    ///in order to compute the DFS path to \c t.
552 552
    ///
553 553
    ///The algorithm computes
554 554
    ///- the %DFS path to \c t,
555 555
    ///- the distance of \c t from the root in the %DFS tree.
556 556
    ///
557 557
    ///\pre init() must be called and a root node should be
558 558
    ///added with addSource() before using this function.
559 559
    void start(Node t)
560 560
    {
561 561
      while ( !emptyQueue() && G->target(_stack[_stack_head])!=t )
562 562
        processNextArc();
563 563
    }
564 564

	
565 565
    ///Executes the algorithm until a condition is met.
566 566

	
567 567
    ///Executes the algorithm until a condition is met.
568 568
    ///
569 569
    ///This method runs the %DFS algorithm from the root node
570 570
    ///until an arc \c a with <tt>am[a]</tt> true is found.
571 571
    ///
572 572
    ///\param am A \c bool (or convertible) arc map. The algorithm
573 573
    ///will stop when it reaches an arc \c a with <tt>am[a]</tt> true.
574 574
    ///
575 575
    ///\return The reached arc \c a with <tt>am[a]</tt> true or
576 576
    ///\c INVALID if no such arc was found.
577 577
    ///
578 578
    ///\pre init() must be called and a root node should be
579 579
    ///added with addSource() before using this function.
580 580
    ///
581 581
    ///\warning Contrary to \ref Bfs and \ref Dijkstra, \c am is an arc map,
582 582
    ///not a node map.
583 583
    template<class ArcBoolMap>
584 584
    Arc start(const ArcBoolMap &am)
585 585
    {
586 586
      while ( !emptyQueue() && !am[_stack[_stack_head]] )
587 587
        processNextArc();
588 588
      return emptyQueue() ? INVALID : _stack[_stack_head];
589 589
    }
590 590

	
591 591
    ///Runs the algorithm from the given source node.
592 592

	
593 593
    ///This method runs the %DFS algorithm from node \c s
594 594
    ///in order to compute the DFS path to each node.
595 595
    ///
596 596
    ///The algorithm computes
597 597
    ///- the %DFS tree,
598 598
    ///- the distance of each node from the root in the %DFS tree.
599 599
    ///
600 600
    ///\note <tt>d.run(s)</tt> is just a shortcut of the following code.
601 601
    ///\code
602 602
    ///  d.init();
603 603
    ///  d.addSource(s);
604 604
    ///  d.start();
605 605
    ///\endcode
606 606
    void run(Node s) {
607 607
      init();
608 608
      addSource(s);
609 609
      start();
610 610
    }
611 611

	
612 612
    ///Finds the %DFS path between \c s and \c t.
613 613

	
614 614
    ///This method runs the %DFS algorithm from node \c s
615 615
    ///in order to compute the DFS path to node \c t
616 616
    ///(it stops searching when \c t is processed)
617 617
    ///
618 618
    ///\return \c true if \c t is reachable form \c s.
619 619
    ///
620 620
    ///\note Apart from the return value, <tt>d.run(s,t)</tt> is
621 621
    ///just a shortcut of the following code.
622 622
    ///\code
623 623
    ///  d.init();
624 624
    ///  d.addSource(s);
625 625
    ///  d.start(t);
626 626
    ///\endcode
627 627
    bool run(Node s,Node t) {
628 628
      init();
629 629
      addSource(s);
630 630
      start(t);
631 631
      return reached(t);
632 632
    }
633 633

	
634 634
    ///Runs the algorithm to visit all nodes in the digraph.
635 635

	
636
    ///This method runs the %DFS algorithm in order to compute the
637
    ///%DFS path to each node.
638
    ///
639
    ///The algorithm computes
640
    ///- the %DFS tree (forest),
641
    ///- the distance of each node from the root(s) in the %DFS tree.
636
    ///This method runs the %DFS algorithm in order to visit all nodes
637
    ///in the digraph.
642 638
    ///
643 639
    ///\note <tt>d.run()</tt> is just a shortcut of the following code.
644 640
    ///\code
645 641
    ///  d.init();
646 642
    ///  for (NodeIt n(digraph); n != INVALID; ++n) {
647 643
    ///    if (!d.reached(n)) {
648 644
    ///      d.addSource(n);
649 645
    ///      d.start();
650 646
    ///    }
651 647
    ///  }
652 648
    ///\endcode
653 649
    void run() {
654 650
      init();
655 651
      for (NodeIt it(*G); it != INVALID; ++it) {
656 652
        if (!reached(it)) {
657 653
          addSource(it);
658 654
          start();
659 655
        }
660 656
      }
661 657
    }
662 658

	
663 659
    ///@}
664 660

	
665 661
    ///\name Query Functions
666 662
    ///The results of the DFS algorithm can be obtained using these
667 663
    ///functions.\n
668 664
    ///Either \ref run(Node) "run()" or \ref start() should be called
669 665
    ///before using them.
670 666

	
671 667
    ///@{
672 668

	
673 669
    ///The DFS path to the given node.
674 670

	
675 671
    ///Returns the DFS path to the given node from the root(s).
676 672
    ///
677 673
    ///\warning \c t should be reached from the root(s).
678 674
    ///
679 675
    ///\pre Either \ref run(Node) "run()" or \ref init()
680 676
    ///must be called before using this function.
681 677
    Path path(Node t) const { return Path(*G, *_pred, t); }
682 678

	
683 679
    ///The distance of the given node from the root(s).
684 680

	
685 681
    ///Returns the distance of the given node from the root(s).
686 682
    ///
687 683
    ///\warning If node \c v is not reached from the root(s), then
688 684
    ///the return value of this function is undefined.
689 685
    ///
690 686
    ///\pre Either \ref run(Node) "run()" or \ref init()
691 687
    ///must be called before using this function.
692 688
    int dist(Node v) const { return (*_dist)[v]; }
693 689

	
694 690
    ///Returns the 'previous arc' of the %DFS tree for the given node.
695 691

	
696 692
    ///This function returns the 'previous arc' of the %DFS tree for the
697 693
    ///node \c v, i.e. it returns the last arc of a %DFS path from a
698 694
    ///root to \c v. It is \c INVALID if \c v is not reached from the
699 695
    ///root(s) or if \c v is a root.
700 696
    ///
701 697
    ///The %DFS tree used here is equal to the %DFS tree used in
702 698
    ///\ref predNode() and \ref predMap().
703 699
    ///
704 700
    ///\pre Either \ref run(Node) "run()" or \ref init()
705 701
    ///must be called before using this function.
706 702
    Arc predArc(Node v) const { return (*_pred)[v];}
707 703

	
708 704
    ///Returns the 'previous node' of the %DFS tree for the given node.
709 705

	
710 706
    ///This function returns the 'previous node' of the %DFS
711 707
    ///tree for the node \c v, i.e. it returns the last but one node
712 708
    ///of a %DFS path from a root to \c v. It is \c INVALID
713 709
    ///if \c v is not reached from the root(s) or if \c v is a root.
714 710
    ///
715 711
    ///The %DFS tree used here is equal to the %DFS tree used in
716 712
    ///\ref predArc() and \ref predMap().
717 713
    ///
718 714
    ///\pre Either \ref run(Node) "run()" or \ref init()
719 715
    ///must be called before using this function.
720 716
    Node predNode(Node v) const { return (*_pred)[v]==INVALID ? INVALID:
721 717
                                  G->source((*_pred)[v]); }
722 718

	
723 719
    ///\brief Returns a const reference to the node map that stores the
724 720
    ///distances of the nodes.
725 721
    ///
726 722
    ///Returns a const reference to the node map that stores the
727 723
    ///distances of the nodes calculated by the algorithm.
728 724
    ///
729 725
    ///\pre Either \ref run(Node) "run()" or \ref init()
730 726
    ///must be called before using this function.
731 727
    const DistMap &distMap() const { return *_dist;}
732 728

	
733 729
    ///\brief Returns a const reference to the node map that stores the
734 730
    ///predecessor arcs.
735 731
    ///
736 732
    ///Returns a const reference to the node map that stores the predecessor
737 733
    ///arcs, which form the DFS tree (forest).
738 734
    ///
739 735
    ///\pre Either \ref run(Node) "run()" or \ref init()
740 736
    ///must be called before using this function.
741 737
    const PredMap &predMap() const { return *_pred;}
742 738

	
743 739
    ///Checks if the given node. node is reached from the root(s).
744 740

	
745 741
    ///Returns \c true if \c v is reached from the root(s).
746 742
    ///
747 743
    ///\pre Either \ref run(Node) "run()" or \ref init()
748 744
    ///must be called before using this function.
749 745
    bool reached(Node v) const { return (*_reached)[v]; }
750 746

	
751 747
    ///@}
752 748
  };
753 749

	
754 750
  ///Default traits class of dfs() function.
755 751

	
756 752
  ///Default traits class of dfs() function.
757 753
  ///\tparam GR Digraph type.
758 754
  template<class GR>
759 755
  struct DfsWizardDefaultTraits
760 756
  {
761 757
    ///The type of the digraph the algorithm runs on.
762 758
    typedef GR Digraph;
763 759

	
764 760
    ///\brief The type of the map that stores the predecessor
765 761
    ///arcs of the %DFS paths.
766 762
    ///
767 763
    ///The type of the map that stores the predecessor
768 764
    ///arcs of the %DFS paths.
769 765
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
770 766
    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
771 767
    ///Instantiates a PredMap.
772 768

	
773 769
    ///This function instantiates a PredMap.
774 770
    ///\param g is the digraph, to which we would like to define the
775 771
    ///PredMap.
776 772
    static PredMap *createPredMap(const Digraph &g)
777 773
    {
778 774
      return new PredMap(g);
779 775
    }
780 776

	
781 777
    ///The type of the map that indicates which nodes are processed.
782 778

	
783 779
    ///The type of the map that indicates which nodes are processed.
784 780
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
785 781
    ///By default it is a NullMap.
786 782
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
787 783
    ///Instantiates a ProcessedMap.
788 784

	
789 785
    ///This function instantiates a ProcessedMap.
790 786
    ///\param g is the digraph, to which
791 787
    ///we would like to define the ProcessedMap.
792 788
#ifdef DOXYGEN
793 789
    static ProcessedMap *createProcessedMap(const Digraph &g)
794 790
#else
795 791
    static ProcessedMap *createProcessedMap(const Digraph &)
796 792
#endif
797 793
    {
798 794
      return new ProcessedMap();
799 795
    }
800 796

	
801 797
    ///The type of the map that indicates which nodes are reached.
802 798

	
803 799
    ///The type of the map that indicates which nodes are reached.
804 800
    ///It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
805 801
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
806 802
    ///Instantiates a ReachedMap.
807 803

	
808 804
    ///This function instantiates a ReachedMap.
809 805
    ///\param g is the digraph, to which
810 806
    ///we would like to define the ReachedMap.
811 807
    static ReachedMap *createReachedMap(const Digraph &g)
812 808
    {
813 809
      return new ReachedMap(g);
814 810
    }
815 811

	
816 812
    ///The type of the map that stores the distances of the nodes.
817 813

	
818 814
    ///The type of the map that stores the distances of the nodes.
819 815
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
820 816
    typedef typename Digraph::template NodeMap<int> DistMap;
821 817
    ///Instantiates a DistMap.
822 818

	
823 819
    ///This function instantiates a DistMap.
824 820
    ///\param g is the digraph, to which we would like to define
825 821
    ///the DistMap
826 822
    static DistMap *createDistMap(const Digraph &g)
827 823
    {
828 824
      return new DistMap(g);
829 825
    }
830 826

	
831 827
    ///The type of the DFS paths.
832 828

	
833 829
    ///The type of the DFS paths.
834 830
    ///It must conform to the \ref concepts::Path "Path" concept.
835 831
    typedef lemon::Path<Digraph> Path;
836 832
  };
837 833

	
838 834
  /// Default traits class used by DfsWizard
839 835

	
840 836
  /// Default traits class used by DfsWizard.
841 837
  /// \tparam GR The type of the digraph.
842 838
  template<class GR>
843 839
  class DfsWizardBase : public DfsWizardDefaultTraits<GR>
844 840
  {
845 841

	
846 842
    typedef DfsWizardDefaultTraits<GR> Base;
847 843
  protected:
848 844
    //The type of the nodes in the digraph.
849 845
    typedef typename Base::Digraph::Node Node;
850 846

	
851 847
    //Pointer to the digraph the algorithm runs on.
852 848
    void *_g;
853 849
    //Pointer to the map of reached nodes.
854 850
    void *_reached;
855 851
    //Pointer to the map of processed nodes.
856 852
    void *_processed;
857 853
    //Pointer to the map of predecessors arcs.
858 854
    void *_pred;
859 855
    //Pointer to the map of distances.
860 856
    void *_dist;
861 857
    //Pointer to the DFS path to the target node.
862 858
    void *_path;
863 859
    //Pointer to the distance of the target node.
864 860
    int *_di;
865 861

	
866 862
    public:
867 863
    /// Constructor.
868 864

	
869 865
    /// This constructor does not require parameters, it initiates
870 866
    /// all of the attributes to \c 0.
871 867
    DfsWizardBase() : _g(0), _reached(0), _processed(0), _pred(0),
872 868
                      _dist(0), _path(0), _di(0) {}
873 869

	
874 870
    /// Constructor.
875 871

	
876 872
    /// This constructor requires one parameter,
877 873
    /// others are initiated to \c 0.
878 874
    /// \param g The digraph the algorithm runs on.
879 875
    DfsWizardBase(const GR &g) :
880 876
      _g(reinterpret_cast<void*>(const_cast<GR*>(&g))),
881 877
      _reached(0), _processed(0), _pred(0), _dist(0),  _path(0), _di(0) {}
882 878

	
883 879
  };
884 880

	
885 881
  /// Auxiliary class for the function-type interface of DFS algorithm.
886 882

	
887 883
  /// This auxiliary class is created to implement the
888 884
  /// \ref dfs() "function-type interface" of \ref Dfs algorithm.
889 885
  /// It does not have own \ref run(Node) "run()" method, it uses the
890 886
  /// functions and features of the plain \ref Dfs.
891 887
  ///
892 888
  /// This class should only be used through the \ref dfs() function,
893 889
  /// which makes it easier to use the algorithm.
894 890
  template<class TR>
895 891
  class DfsWizard : public TR
896 892
  {
897 893
    typedef TR Base;
898 894

	
899 895
    typedef typename TR::Digraph Digraph;
900 896

	
901 897
    typedef typename Digraph::Node Node;
902 898
    typedef typename Digraph::NodeIt NodeIt;
903 899
    typedef typename Digraph::Arc Arc;
904 900
    typedef typename Digraph::OutArcIt OutArcIt;
905 901

	
906 902
    typedef typename TR::PredMap PredMap;
907 903
    typedef typename TR::DistMap DistMap;
908 904
    typedef typename TR::ReachedMap ReachedMap;
909 905
    typedef typename TR::ProcessedMap ProcessedMap;
910 906
    typedef typename TR::Path Path;
911 907

	
912 908
  public:
913 909

	
914 910
    /// Constructor.
915 911
    DfsWizard() : TR() {}
916 912

	
917 913
    /// Constructor that requires parameters.
918 914

	
919 915
    /// Constructor that requires parameters.
920 916
    /// These parameters will be the default values for the traits class.
921 917
    /// \param g The digraph the algorithm runs on.
922 918
    DfsWizard(const Digraph &g) :
923 919
      TR(g) {}
924 920

	
925 921
    ///Copy constructor
926 922
    DfsWizard(const TR &b) : TR(b) {}
927 923

	
928 924
    ~DfsWizard() {}
929 925

	
930 926
    ///Runs DFS algorithm from the given source node.
931 927

	
932 928
    ///This method runs DFS algorithm from node \c s
933 929
    ///in order to compute the DFS path to each node.
934 930
    void run(Node s)
935 931
    {
936 932
      Dfs<Digraph,TR> alg(*reinterpret_cast<const Digraph*>(Base::_g));
937 933
      if (Base::_pred)
938 934
        alg.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
939 935
      if (Base::_dist)
940 936
        alg.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
941 937
      if (Base::_reached)
942 938
        alg.reachedMap(*reinterpret_cast<ReachedMap*>(Base::_reached));
943 939
      if (Base::_processed)
944 940
        alg.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
945 941
      if (s!=INVALID)
946 942
        alg.run(s);
947 943
      else
948 944
        alg.run();
949 945
    }
950 946

	
951 947
    ///Finds the DFS path between \c s and \c t.
952 948

	
953 949
    ///This method runs DFS algorithm from node \c s
954 950
    ///in order to compute the DFS path to node \c t
955 951
    ///(it stops searching when \c t is processed).
956 952
    ///
957 953
    ///\return \c true if \c t is reachable form \c s.
958 954
    bool run(Node s, Node t)
959 955
    {
960 956
      Dfs<Digraph,TR> alg(*reinterpret_cast<const Digraph*>(Base::_g));
961 957
      if (Base::_pred)
962 958
        alg.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
963 959
      if (Base::_dist)
964 960
        alg.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
965 961
      if (Base::_reached)
966 962
        alg.reachedMap(*reinterpret_cast<ReachedMap*>(Base::_reached));
967 963
      if (Base::_processed)
968 964
        alg.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
969 965
      alg.run(s,t);
970 966
      if (Base::_path)
971 967
        *reinterpret_cast<Path*>(Base::_path) = alg.path(t);
972 968
      if (Base::_di)
973 969
        *Base::_di = alg.dist(t);
974 970
      return alg.reached(t);
975 971
      }
976 972

	
977 973
    ///Runs DFS algorithm to visit all nodes in the digraph.
978 974

	
979
    ///This method runs DFS algorithm in order to compute
980
    ///the DFS path to each node.
975
    ///This method runs DFS algorithm in order to visit all nodes
976
    ///in the digraph.
981 977
    void run()
982 978
    {
983 979
      run(INVALID);
984 980
    }
985 981

	
986 982
    template<class T>
987 983
    struct SetPredMapBase : public Base {
988 984
      typedef T PredMap;
989 985
      static PredMap *createPredMap(const Digraph &) { return 0; };
990 986
      SetPredMapBase(const TR &b) : TR(b) {}
991 987
    };
992 988

	
993 989
    ///\brief \ref named-templ-param "Named parameter" for setting
994 990
    ///the predecessor map.
995 991
    ///
996 992
    ///\ref named-templ-param "Named parameter" function for setting
997 993
    ///the map that stores the predecessor arcs of the nodes.
998 994
    template<class T>
999 995
    DfsWizard<SetPredMapBase<T> > predMap(const T &t)
1000 996
    {
1001 997
      Base::_pred=reinterpret_cast<void*>(const_cast<T*>(&t));
1002 998
      return DfsWizard<SetPredMapBase<T> >(*this);
1003 999
    }
1004 1000

	
1005 1001
    template<class T>
1006 1002
    struct SetReachedMapBase : public Base {
1007 1003
      typedef T ReachedMap;
1008 1004
      static ReachedMap *createReachedMap(const Digraph &) { return 0; };
1009 1005
      SetReachedMapBase(const TR &b) : TR(b) {}
1010 1006
    };
1011 1007

	
1012 1008
    ///\brief \ref named-templ-param "Named parameter" for setting
1013 1009
    ///the reached map.
1014 1010
    ///
1015 1011
    ///\ref named-templ-param "Named parameter" function for setting
1016 1012
    ///the map that indicates which nodes are reached.
1017 1013
    template<class T>
1018 1014
    DfsWizard<SetReachedMapBase<T> > reachedMap(const T &t)
1019 1015
    {
1020 1016
      Base::_reached=reinterpret_cast<void*>(const_cast<T*>(&t));
1021 1017
      return DfsWizard<SetReachedMapBase<T> >(*this);
1022 1018
    }
1023 1019

	
1024 1020
    template<class T>
1025 1021
    struct SetDistMapBase : public Base {
1026 1022
      typedef T DistMap;
1027 1023
      static DistMap *createDistMap(const Digraph &) { return 0; };
1028 1024
      SetDistMapBase(const TR &b) : TR(b) {}
1029 1025
    };
1030 1026

	
1031 1027
    ///\brief \ref named-templ-param "Named parameter" for setting
1032 1028
    ///the distance map.
1033 1029
    ///
1034 1030
    ///\ref named-templ-param "Named parameter" function for setting
1035 1031
    ///the map that stores the distances of the nodes calculated
1036 1032
    ///by the algorithm.
1037 1033
    template<class T>
1038 1034
    DfsWizard<SetDistMapBase<T> > distMap(const T &t)
1039 1035
    {
1040 1036
      Base::_dist=reinterpret_cast<void*>(const_cast<T*>(&t));
1041 1037
      return DfsWizard<SetDistMapBase<T> >(*this);
1042 1038
    }
1043 1039

	
1044 1040
    template<class T>
1045 1041
    struct SetProcessedMapBase : public Base {
1046 1042
      typedef T ProcessedMap;
1047 1043
      static ProcessedMap *createProcessedMap(const Digraph &) { return 0; };
1048 1044
      SetProcessedMapBase(const TR &b) : TR(b) {}
1049 1045
    };
1050 1046

	
1051 1047
    ///\brief \ref named-func-param "Named parameter" for setting
1052 1048
    ///the processed map.
1053 1049
    ///
1054 1050
    ///\ref named-templ-param "Named parameter" function for setting
1055 1051
    ///the map that indicates which nodes are processed.
1056 1052
    template<class T>
1057 1053
    DfsWizard<SetProcessedMapBase<T> > processedMap(const T &t)
1058 1054
    {
1059 1055
      Base::_processed=reinterpret_cast<void*>(const_cast<T*>(&t));
1060 1056
      return DfsWizard<SetProcessedMapBase<T> >(*this);
1061 1057
    }
1062 1058

	
1063 1059
    template<class T>
1064 1060
    struct SetPathBase : public Base {
1065 1061
      typedef T Path;
1066 1062
      SetPathBase(const TR &b) : TR(b) {}
1067 1063
    };
1068 1064
    ///\brief \ref named-func-param "Named parameter"
1069 1065
    ///for getting the DFS path to the target node.
1070 1066
    ///
1071 1067
    ///\ref named-func-param "Named parameter"
1072 1068
    ///for getting the DFS path to the target node.
1073 1069
    template<class T>
1074 1070
    DfsWizard<SetPathBase<T> > path(const T &t)
1075 1071
    {
1076 1072
      Base::_path=reinterpret_cast<void*>(const_cast<T*>(&t));
1077 1073
      return DfsWizard<SetPathBase<T> >(*this);
1078 1074
    }
1079 1075

	
1080 1076
    ///\brief \ref named-func-param "Named parameter"
1081 1077
    ///for getting the distance of the target node.
1082 1078
    ///
1083 1079
    ///\ref named-func-param "Named parameter"
1084 1080
    ///for getting the distance of the target node.
1085 1081
    DfsWizard dist(const int &d)
1086 1082
    {
1087 1083
      Base::_di=const_cast<int*>(&d);
1088 1084
      return *this;
1089 1085
    }
1090 1086

	
1091 1087
  };
1092 1088

	
1093 1089
  ///Function-type interface for DFS algorithm.
1094 1090

	
1095 1091
  ///\ingroup search
1096 1092
  ///Function-type interface for DFS algorithm.
1097 1093
  ///
1098 1094
  ///This function also has several \ref named-func-param "named parameters",
1099 1095
  ///they are declared as the members of class \ref DfsWizard.
1100 1096
  ///The following examples show how to use these parameters.
1101 1097
  ///\code
1102 1098
  ///  // Compute the DFS tree
1103 1099
  ///  dfs(g).predMap(preds).distMap(dists).run(s);
1104 1100
  ///
1105 1101
  ///  // Compute the DFS path from s to t
1106 1102
  ///  bool reached = dfs(g).path(p).dist(d).run(s,t);
1107 1103
  ///\endcode
1108 1104
  ///\warning Don't forget to put the \ref DfsWizard::run(Node) "run()"
1109 1105
  ///to the end of the parameter list.
1110 1106
  ///\sa DfsWizard
1111 1107
  ///\sa Dfs
1112 1108
  template<class GR>
1113 1109
  DfsWizard<DfsWizardBase<GR> >
1114 1110
  dfs(const GR &digraph)
1115 1111
  {
1116 1112
    return DfsWizard<DfsWizardBase<GR> >(digraph);
1117 1113
  }
1118 1114

	
1119 1115
#ifdef DOXYGEN
1120 1116
  /// \brief Visitor class for DFS.
1121 1117
  ///
1122 1118
  /// This class defines the interface of the DfsVisit events, and
1123 1119
  /// it could be the base of a real visitor class.
1124 1120
  template <typename GR>
1125 1121
  struct DfsVisitor {
1126 1122
    typedef GR Digraph;
1127 1123
    typedef typename Digraph::Arc Arc;
1128 1124
    typedef typename Digraph::Node Node;
1129 1125
    /// \brief Called for the source node of the DFS.
1130 1126
    ///
1131 1127
    /// This function is called for the source node of the DFS.
1132 1128
    void start(const Node& node) {}
1133 1129
    /// \brief Called when the source node is leaved.
1134 1130
    ///
1135 1131
    /// This function is called when the source node is leaved.
1136 1132
    void stop(const Node& node) {}
1137 1133
    /// \brief Called when a node is reached first time.
1138 1134
    ///
1139 1135
    /// This function is called when a node is reached first time.
1140 1136
    void reach(const Node& node) {}
1141 1137
    /// \brief Called when an arc reaches a new node.
1142 1138
    ///
1143 1139
    /// This function is called when the DFS finds an arc whose target node
1144 1140
    /// is not reached yet.
1145 1141
    void discover(const Arc& arc) {}
1146 1142
    /// \brief Called when an arc is examined but its target node is
1147 1143
    /// already discovered.
1148 1144
    ///
1149 1145
    /// This function is called when an arc is examined but its target node is
1150 1146
    /// already discovered.
1151 1147
    void examine(const Arc& arc) {}
1152 1148
    /// \brief Called when the DFS steps back from a node.
1153 1149
    ///
1154 1150
    /// This function is called when the DFS steps back from a node.
1155 1151
    void leave(const Node& node) {}
1156 1152
    /// \brief Called when the DFS steps back on an arc.
1157 1153
    ///
1158 1154
    /// This function is called when the DFS steps back on an arc.
1159 1155
    void backtrack(const Arc& arc) {}
1160 1156
  };
1161 1157
#else
1162 1158
  template <typename GR>
1163 1159
  struct DfsVisitor {
1164 1160
    typedef GR Digraph;
1165 1161
    typedef typename Digraph::Arc Arc;
1166 1162
    typedef typename Digraph::Node Node;
1167 1163
    void start(const Node&) {}
1168 1164
    void stop(const Node&) {}
1169 1165
    void reach(const Node&) {}
1170 1166
    void discover(const Arc&) {}
1171 1167
    void examine(const Arc&) {}
1172 1168
    void leave(const Node&) {}
1173 1169
    void backtrack(const Arc&) {}
1174 1170

	
1175 1171
    template <typename _Visitor>
1176 1172
    struct Constraints {
1177 1173
      void constraints() {
1178 1174
        Arc arc;
1179 1175
        Node node;
1180 1176
        visitor.start(node);
1181 1177
        visitor.stop(arc);
1182 1178
        visitor.reach(node);
1183 1179
        visitor.discover(arc);
1184 1180
        visitor.examine(arc);
1185 1181
        visitor.leave(node);
1186 1182
        visitor.backtrack(arc);
1187 1183
      }
1188 1184
      _Visitor& visitor;
1189 1185
    };
1190 1186
  };
1191 1187
#endif
1192 1188

	
1193 1189
  /// \brief Default traits class of DfsVisit class.
1194 1190
  ///
1195 1191
  /// Default traits class of DfsVisit class.
1196 1192
  /// \tparam _Digraph The type of the digraph the algorithm runs on.
1197 1193
  template<class GR>
1198 1194
  struct DfsVisitDefaultTraits {
1199 1195

	
1200 1196
    /// \brief The type of the digraph the algorithm runs on.
1201 1197
    typedef GR Digraph;
1202 1198

	
1203 1199
    /// \brief The type of the map that indicates which nodes are reached.
1204 1200
    ///
1205 1201
    /// The type of the map that indicates which nodes are reached.
1206 1202
    /// It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
1207 1203
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
1208 1204

	
1209 1205
    /// \brief Instantiates a ReachedMap.
1210 1206
    ///
1211 1207
    /// This function instantiates a ReachedMap.
1212 1208
    /// \param digraph is the digraph, to which
1213 1209
    /// we would like to define the ReachedMap.
1214 1210
    static ReachedMap *createReachedMap(const Digraph &digraph) {
1215 1211
      return new ReachedMap(digraph);
1216 1212
    }
1217 1213

	
1218 1214
  };
1219 1215

	
1220 1216
  /// \ingroup search
1221 1217
  ///
1222 1218
  /// \brief DFS algorithm class with visitor interface.
1223 1219
  ///
1224 1220
  /// This class provides an efficient implementation of the DFS algorithm
1225 1221
  /// with visitor interface.
1226 1222
  ///
1227 1223
  /// The DfsVisit class provides an alternative interface to the Dfs
1228 1224
  /// class. It works with callback mechanism, the DfsVisit object calls
1229 1225
  /// the member functions of the \c Visitor class on every DFS event.
1230 1226
  ///
1231 1227
  /// This interface of the DFS algorithm should be used in special cases
1232 1228
  /// when extra actions have to be performed in connection with certain
1233 1229
  /// events of the DFS algorithm. Otherwise consider to use Dfs or dfs()
1234 1230
  /// instead.
1235 1231
  ///
1236 1232
  /// \tparam GR The type of the digraph the algorithm runs on.
1237 1233
  /// The default type is \ref ListDigraph.
1238 1234
  /// The value of GR is not used directly by \ref DfsVisit,
1239 1235
  /// it is only passed to \ref DfsVisitDefaultTraits.
1240 1236
  /// \tparam VS The Visitor type that is used by the algorithm.
1241 1237
  /// \ref DfsVisitor "DfsVisitor<GR>" is an empty visitor, which
1242 1238
  /// does not observe the DFS events. If you want to observe the DFS
1243 1239
  /// events, you should implement your own visitor class.
1244 1240
  /// \tparam TR Traits class to set various data types used by the
1245 1241
  /// algorithm. The default traits class is
1246 1242
  /// \ref DfsVisitDefaultTraits "DfsVisitDefaultTraits<GR>".
1247 1243
  /// See \ref DfsVisitDefaultTraits for the documentation of
1248 1244
  /// a DFS visit traits class.
1249 1245
#ifdef DOXYGEN
1250 1246
  template <typename GR, typename VS, typename TR>
1251 1247
#else
1252 1248
  template <typename GR = ListDigraph,
1253 1249
            typename VS = DfsVisitor<GR>,
1254 1250
            typename TR = DfsVisitDefaultTraits<GR> >
1255 1251
#endif
1256 1252
  class DfsVisit {
1257 1253
  public:
1258 1254

	
1259 1255
    ///The traits class.
1260 1256
    typedef TR Traits;
1261 1257

	
1262 1258
    ///The type of the digraph the algorithm runs on.
1263 1259
    typedef typename Traits::Digraph Digraph;
1264 1260

	
1265 1261
    ///The visitor type used by the algorithm.
1266 1262
    typedef VS Visitor;
1267 1263

	
1268 1264
    ///The type of the map that indicates which nodes are reached.
1269 1265
    typedef typename Traits::ReachedMap ReachedMap;
1270 1266

	
1271 1267
  private:
1272 1268

	
1273 1269
    typedef typename Digraph::Node Node;
1274 1270
    typedef typename Digraph::NodeIt NodeIt;
1275 1271
    typedef typename Digraph::Arc Arc;
1276 1272
    typedef typename Digraph::OutArcIt OutArcIt;
1277 1273

	
1278 1274
    //Pointer to the underlying digraph.
1279 1275
    const Digraph *_digraph;
1280 1276
    //Pointer to the visitor object.
1281 1277
    Visitor *_visitor;
1282 1278
    //Pointer to the map of reached status of the nodes.
1283 1279
    ReachedMap *_reached;
1284 1280
    //Indicates if _reached is locally allocated (true) or not.
1285 1281
    bool local_reached;
1286 1282

	
1287 1283
    std::vector<typename Digraph::Arc> _stack;
1288 1284
    int _stack_head;
1289 1285

	
1290 1286
    //Creates the maps if necessary.
1291 1287
    void create_maps() {
1292 1288
      if(!_reached) {
1293 1289
        local_reached = true;
1294 1290
        _reached = Traits::createReachedMap(*_digraph);
1295 1291
      }
1296 1292
    }
1297 1293

	
1298 1294
  protected:
1299 1295

	
1300 1296
    DfsVisit() {}
1301 1297

	
1302 1298
  public:
1303 1299

	
1304 1300
    typedef DfsVisit Create;
1305 1301

	
1306 1302
    /// \name Named Template Parameters
1307 1303

	
1308 1304
    ///@{
1309 1305
    template <class T>
1310 1306
    struct SetReachedMapTraits : public Traits {
1311 1307
      typedef T ReachedMap;
1312 1308
      static ReachedMap *createReachedMap(const Digraph &digraph) {
1313 1309
        LEMON_ASSERT(false, "ReachedMap is not initialized");
1314 1310
        return 0; // ignore warnings
1315 1311
      }
1316 1312
    };
1317 1313
    /// \brief \ref named-templ-param "Named parameter" for setting
1318 1314
    /// ReachedMap type.
1319 1315
    ///
1320 1316
    /// \ref named-templ-param "Named parameter" for setting ReachedMap type.
1321 1317
    template <class T>
1322 1318
    struct SetReachedMap : public DfsVisit< Digraph, Visitor,
1323 1319
                                            SetReachedMapTraits<T> > {
1324 1320
      typedef DfsVisit< Digraph, Visitor, SetReachedMapTraits<T> > Create;
1325 1321
    };
1326 1322
    ///@}
1327 1323

	
1328 1324
  public:
1329 1325

	
1330 1326
    /// \brief Constructor.
1331 1327
    ///
1332 1328
    /// Constructor.
1333 1329
    ///
1334 1330
    /// \param digraph The digraph the algorithm runs on.
1335 1331
    /// \param visitor The visitor object of the algorithm.
1336 1332
    DfsVisit(const Digraph& digraph, Visitor& visitor)
1337 1333
      : _digraph(&digraph), _visitor(&visitor),
1338 1334
        _reached(0), local_reached(false) {}
1339 1335

	
1340 1336
    /// \brief Destructor.
1341 1337
    ~DfsVisit() {
1342 1338
      if(local_reached) delete _reached;
1343 1339
    }
1344 1340

	
1345 1341
    /// \brief Sets the map that indicates which nodes are reached.
1346 1342
    ///
1347 1343
    /// Sets the map that indicates which nodes are reached.
1348 1344
    /// If you don't use this function before calling \ref run(Node) "run()"
1349 1345
    /// or \ref init(), an instance will be allocated automatically.
1350 1346
    /// The destructor deallocates this automatically allocated map,
1351 1347
    /// of course.
1352 1348
    /// \return <tt> (*this) </tt>
1353 1349
    DfsVisit &reachedMap(ReachedMap &m) {
1354 1350
      if(local_reached) {
1355 1351
        delete _reached;
1356 1352
        local_reached=false;
1357 1353
      }
1358 1354
      _reached = &m;
1359 1355
      return *this;
1360 1356
    }
1361 1357

	
1362 1358
  public:
1363 1359

	
1364 1360
    /// \name Execution Control
1365 1361
    /// The simplest way to execute the DFS algorithm is to use one of the
1366 1362
    /// member functions called \ref run(Node) "run()".\n
1367 1363
    /// If you need better control on the execution, you have to call
1368 1364
    /// \ref init() first, then you can add a source node with \ref addSource()
1369 1365
    /// and perform the actual computation with \ref start().
1370 1366
    /// This procedure can be repeated if there are nodes that have not
1371 1367
    /// been reached.
1372 1368

	
1373 1369
    /// @{
1374 1370

	
1375 1371
    /// \brief Initializes the internal data structures.
1376 1372
    ///
1377 1373
    /// Initializes the internal data structures.
1378 1374
    void init() {
1379 1375
      create_maps();
1380 1376
      _stack.resize(countNodes(*_digraph));
1381 1377
      _stack_head = -1;
1382 1378
      for (NodeIt u(*_digraph) ; u != INVALID ; ++u) {
1383 1379
        _reached->set(u, false);
1384 1380
      }
1385 1381
    }
1386 1382

	
1387 1383
    /// \brief Adds a new source node.
1388 1384
    ///
1389 1385
    /// Adds a new source node to the set of nodes to be processed.
1390 1386
    ///
1391 1387
    /// \pre The stack must be empty. Otherwise the algorithm gives
1392 1388
    /// wrong results. (One of the outgoing arcs of all the source nodes
1393 1389
    /// except for the last one will not be visited and distances will
1394 1390
    /// also be wrong.)
1395 1391
    void addSource(Node s)
1396 1392
    {
1397 1393
      LEMON_DEBUG(emptyQueue(), "The stack is not empty.");
1398 1394
      if(!(*_reached)[s]) {
1399 1395
          _reached->set(s,true);
1400 1396
          _visitor->start(s);
1401 1397
          _visitor->reach(s);
1402 1398
          Arc e;
1403 1399
          _digraph->firstOut(e, s);
1404 1400
          if (e != INVALID) {
1405 1401
            _stack[++_stack_head] = e;
1406 1402
          } else {
1407 1403
            _visitor->leave(s);
1408 1404
            _visitor->stop(s);
1409 1405
          }
1410 1406
        }
1411 1407
    }
1412 1408

	
1413 1409
    /// \brief Processes the next arc.
1414 1410
    ///
1415 1411
    /// Processes the next arc.
1416 1412
    ///
1417 1413
    /// \return The processed arc.
1418 1414
    ///
1419 1415
    /// \pre The stack must not be empty.
1420 1416
    Arc processNextArc() {
1421 1417
      Arc e = _stack[_stack_head];
1422 1418
      Node m = _digraph->target(e);
1423 1419
      if(!(*_reached)[m]) {
1424 1420
        _visitor->discover(e);
1425 1421
        _visitor->reach(m);
1426 1422
        _reached->set(m, true);
1427 1423
        _digraph->firstOut(_stack[++_stack_head], m);
1428 1424
      } else {
1429 1425
        _visitor->examine(e);
1430 1426
        m = _digraph->source(e);
1431 1427
        _digraph->nextOut(_stack[_stack_head]);
1432 1428
      }
1433 1429
      while (_stack_head>=0 && _stack[_stack_head] == INVALID) {
1434 1430
        _visitor->leave(m);
1435 1431
        --_stack_head;
1436 1432
        if (_stack_head >= 0) {
1437 1433
          _visitor->backtrack(_stack[_stack_head]);
1438 1434
          m = _digraph->source(_stack[_stack_head]);
1439 1435
          _digraph->nextOut(_stack[_stack_head]);
1440 1436
        } else {
1441 1437
          _visitor->stop(m);
1442 1438
        }
1443 1439
      }
1444 1440
      return e;
1445 1441
    }
1446 1442

	
1447 1443
    /// \brief Next arc to be processed.
1448 1444
    ///
1449 1445
    /// Next arc to be processed.
1450 1446
    ///
1451 1447
    /// \return The next arc to be processed or INVALID if the stack is
1452 1448
    /// empty.
1453 1449
    Arc nextArc() const {
1454 1450
      return _stack_head >= 0 ? _stack[_stack_head] : INVALID;
1455 1451
    }
1456 1452

	
1457 1453
    /// \brief Returns \c false if there are nodes
1458 1454
    /// to be processed.
1459 1455
    ///
1460 1456
    /// Returns \c false if there are nodes
1461 1457
    /// to be processed in the queue (stack).
1462 1458
    bool emptyQueue() const { return _stack_head < 0; }
1463 1459

	
1464 1460
    /// \brief Returns the number of the nodes to be processed.
1465 1461
    ///
1466 1462
    /// Returns the number of the nodes to be processed in the queue (stack).
1467 1463
    int queueSize() const { return _stack_head + 1; }
1468 1464

	
1469 1465
    /// \brief Executes the algorithm.
1470 1466
    ///
1471 1467
    /// Executes the algorithm.
1472 1468
    ///
1473 1469
    /// This method runs the %DFS algorithm from the root node
1474 1470
    /// in order to compute the %DFS path to each node.
1475 1471
    ///
1476 1472
    /// The algorithm computes
1477 1473
    /// - the %DFS tree,
1478 1474
    /// - the distance of each node from the root in the %DFS tree.
1479 1475
    ///
1480 1476
    /// \pre init() must be called and a root node should be
1481 1477
    /// added with addSource() before using this function.
1482 1478
    ///
1483 1479
    /// \note <tt>d.start()</tt> is just a shortcut of the following code.
1484 1480
    /// \code
1485 1481
    ///   while ( !d.emptyQueue() ) {
1486 1482
    ///     d.processNextArc();
1487 1483
    ///   }
1488 1484
    /// \endcode
1489 1485
    void start() {
1490 1486
      while ( !emptyQueue() ) processNextArc();
1491 1487
    }
1492 1488

	
1493 1489
    /// \brief Executes the algorithm until the given target node is reached.
1494 1490
    ///
1495 1491
    /// Executes the algorithm until the given target node is reached.
1496 1492
    ///
1497 1493
    /// This method runs the %DFS algorithm from the root node
1498 1494
    /// in order to compute the DFS path to \c t.
1499 1495
    ///
1500 1496
    /// The algorithm computes
1501 1497
    /// - the %DFS path to \c t,
1502 1498
    /// - the distance of \c t from the root in the %DFS tree.
1503 1499
    ///
1504 1500
    /// \pre init() must be called and a root node should be added
1505 1501
    /// with addSource() before using this function.
1506 1502
    void start(Node t) {
1507 1503
      while ( !emptyQueue() && _digraph->target(_stack[_stack_head]) != t )
1508 1504
        processNextArc();
1509 1505
    }
1510 1506

	
1511 1507
    /// \brief Executes the algorithm until a condition is met.
1512 1508
    ///
1513 1509
    /// Executes the algorithm until a condition is met.
1514 1510
    ///
1515 1511
    /// This method runs the %DFS algorithm from the root node
1516 1512
    /// until an arc \c a with <tt>am[a]</tt> true is found.
1517 1513
    ///
1518 1514
    /// \param am A \c bool (or convertible) arc map. The algorithm
1519 1515
    /// will stop when it reaches an arc \c a with <tt>am[a]</tt> true.
1520 1516
    ///
1521 1517
    /// \return The reached arc \c a with <tt>am[a]</tt> true or
1522 1518
    /// \c INVALID if no such arc was found.
1523 1519
    ///
1524 1520
    /// \pre init() must be called and a root node should be added
1525 1521
    /// with addSource() before using this function.
1526 1522
    ///
1527 1523
    /// \warning Contrary to \ref Bfs and \ref Dijkstra, \c am is an arc map,
1528 1524
    /// not a node map.
1529 1525
    template <typename AM>
1530 1526
    Arc start(const AM &am) {
1531 1527
      while ( !emptyQueue() && !am[_stack[_stack_head]] )
1532 1528
        processNextArc();
1533 1529
      return emptyQueue() ? INVALID : _stack[_stack_head];
1534 1530
    }
1535 1531

	
1536 1532
    /// \brief Runs the algorithm from the given source node.
1537 1533
    ///
1538 1534
    /// This method runs the %DFS algorithm from node \c s.
1539 1535
    /// in order to compute the DFS path to each node.
1540 1536
    ///
1541 1537
    /// The algorithm computes
1542 1538
    /// - the %DFS tree,
1543 1539
    /// - the distance of each node from the root in the %DFS tree.
1544 1540
    ///
1545 1541
    /// \note <tt>d.run(s)</tt> is just a shortcut of the following code.
1546 1542
    ///\code
1547 1543
    ///   d.init();
1548 1544
    ///   d.addSource(s);
1549 1545
    ///   d.start();
1550 1546
    ///\endcode
1551 1547
    void run(Node s) {
1552 1548
      init();
1553 1549
      addSource(s);
1554 1550
      start();
1555 1551
    }
1556 1552

	
1557 1553
    /// \brief Finds the %DFS path between \c s and \c t.
1558 1554

	
1559 1555
    /// This method runs the %DFS algorithm from node \c s
1560 1556
    /// in order to compute the DFS path to node \c t
1561 1557
    /// (it stops searching when \c t is processed).
1562 1558
    ///
1563 1559
    /// \return \c true if \c t is reachable form \c s.
1564 1560
    ///
1565 1561
    /// \note Apart from the return value, <tt>d.run(s,t)</tt> is
1566 1562
    /// just a shortcut of the following code.
1567 1563
    ///\code
1568 1564
    ///   d.init();
1569 1565
    ///   d.addSource(s);
1570 1566
    ///   d.start(t);
1571 1567
    ///\endcode
1572 1568
    bool run(Node s,Node t) {
1573 1569
      init();
1574 1570
      addSource(s);
1575 1571
      start(t);
1576 1572
      return reached(t);
1577 1573
    }
1578 1574

	
1579 1575
    /// \brief Runs the algorithm to visit all nodes in the digraph.
1580 1576

	
1581
    /// This method runs the %DFS algorithm in order to
1582
    /// compute the %DFS path to each node.
1583
    ///
1584
    /// The algorithm computes
1585
    /// - the %DFS tree (forest),
1586
    /// - the distance of each node from the root(s) in the %DFS tree.
1577
    /// This method runs the %DFS algorithm in order to visit all nodes
1578
    /// in the digraph.
1587 1579
    ///
1588 1580
    /// \note <tt>d.run()</tt> is just a shortcut of the following code.
1589 1581
    ///\code
1590 1582
    ///   d.init();
1591 1583
    ///   for (NodeIt n(digraph); n != INVALID; ++n) {
1592 1584
    ///     if (!d.reached(n)) {
1593 1585
    ///       d.addSource(n);
1594 1586
    ///       d.start();
1595 1587
    ///     }
1596 1588
    ///   }
1597 1589
    ///\endcode
1598 1590
    void run() {
1599 1591
      init();
1600 1592
      for (NodeIt it(*_digraph); it != INVALID; ++it) {
1601 1593
        if (!reached(it)) {
1602 1594
          addSource(it);
1603 1595
          start();
1604 1596
        }
1605 1597
      }
1606 1598
    }
1607 1599

	
1608 1600
    ///@}
1609 1601

	
1610 1602
    /// \name Query Functions
1611 1603
    /// The results of the DFS algorithm can be obtained using these
1612 1604
    /// functions.\n
1613 1605
    /// Either \ref run(Node) "run()" or \ref start() should be called
1614 1606
    /// before using them.
1615 1607

	
1616 1608
    ///@{
1617 1609

	
1618 1610
    /// \brief Checks if the given node is reached from the root(s).
1619 1611
    ///
1620 1612
    /// Returns \c true if \c v is reached from the root(s).
1621 1613
    ///
1622 1614
    /// \pre Either \ref run(Node) "run()" or \ref init()
1623 1615
    /// must be called before using this function.
1624 1616
    bool reached(Node v) const { return (*_reached)[v]; }
1625 1617

	
1626 1618
    ///@}
1627 1619

	
1628 1620
  };
1629 1621

	
1630 1622
} //END OF NAMESPACE LEMON
1631 1623

	
1632 1624
#endif

Changeset was too big and was cut off... Show full diff

0 comments (0 inline)