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:
↑ Collapse diff ↑
Show white space 384 line context
... ...
@@ -171,743 +171,748 @@
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)]))
... ...
@@ -1125,799 +1130,807 @@
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 {
... ...
@@ -2043,830 +2056,838 @@
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
... ...
@@ -3136,384 +3157,387 @@
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:
Show white space 384 line context
... ...
@@ -512,731 +512,727 @@
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);
... ...
@@ -1506,244 +1502,240 @@
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
Show white space 384 line context
... ...
@@ -444,729 +444,725 @@
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&) {}
... ...
@@ -1389,244 +1385,240 @@
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
Show white space 384 line context
... ...
@@ -17,385 +17,385 @@
17 17
 */
18 18

	
19 19
#ifndef LEMON_DIJKSTRA_H
20 20
#define LEMON_DIJKSTRA_H
21 21

	
22 22
///\ingroup shortest_path
23 23
///\file
24 24
///\brief Dijkstra algorithm.
25 25

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

	
35 35
namespace lemon {
36 36

	
37 37
  /// \brief Default operation traits for the Dijkstra algorithm class.
38 38
  ///
39 39
  /// This operation traits class defines all computational operations and
40 40
  /// constants which are used in the Dijkstra algorithm.
41 41
  template <typename V>
42 42
  struct DijkstraDefaultOperationTraits {
43 43
    /// \e
44 44
    typedef V Value;
45 45
    /// \brief Gives back the zero value of the type.
46 46
    static Value zero() {
47 47
      return static_cast<Value>(0);
48 48
    }
49 49
    /// \brief Gives back the sum of the given two elements.
50 50
    static Value plus(const Value& left, const Value& right) {
51 51
      return left + right;
52 52
    }
53 53
    /// \brief Gives back true only if the first value is less than the second.
54 54
    static bool less(const Value& left, const Value& right) {
55 55
      return left < right;
56 56
    }
57 57
  };
58 58

	
59 59
  ///Default traits class of Dijkstra class.
60 60

	
61 61
  ///Default traits class of Dijkstra class.
62 62
  ///\tparam GR The type of the digraph.
63 63
  ///\tparam LEN The type of the length map.
64 64
  template<typename GR, typename LEN>
65 65
  struct DijkstraDefaultTraits
66 66
  {
67 67
    ///The type of the digraph the algorithm runs on.
68 68
    typedef GR Digraph;
69 69

	
70 70
    ///The type of the map that stores the arc lengths.
71 71

	
72 72
    ///The type of the map that stores the arc lengths.
73 73
    ///It must conform to the \ref concepts::ReadMap "ReadMap" concept.
74 74
    typedef LEN LengthMap;
75 75
    ///The type of the arc lengths.
76 76
    typedef typename LEN::Value Value;
77 77

	
78 78
    /// Operation traits for %Dijkstra algorithm.
79 79

	
80 80
    /// This class defines the operations that are used in the algorithm.
81 81
    /// \see DijkstraDefaultOperationTraits
82 82
    typedef DijkstraDefaultOperationTraits<Value> OperationTraits;
83 83

	
84 84
    /// The cross reference type used by the heap.
85 85

	
86 86
    /// The cross reference type used by the heap.
87 87
    /// Usually it is \c Digraph::NodeMap<int>.
88 88
    typedef typename Digraph::template NodeMap<int> HeapCrossRef;
89 89
    ///Instantiates a \c HeapCrossRef.
90 90

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

	
99 99
    ///The heap type used by the %Dijkstra algorithm.
100 100

	
101 101
    ///The heap type used by the Dijkstra algorithm.
102 102
    ///
103 103
    ///\sa BinHeap
104 104
    ///\sa Dijkstra
105 105
    typedef BinHeap<typename LEN::Value, HeapCrossRef, std::less<Value> > Heap;
106 106
    ///Instantiates a \c Heap.
107 107

	
108 108
    ///This function instantiates a \ref Heap.
109 109
    static Heap *createHeap(HeapCrossRef& r)
110 110
    {
111 111
      return new Heap(r);
112 112
    }
113 113

	
114 114
    ///\brief The type of the map that stores the predecessor
115 115
    ///arcs of the shortest paths.
116 116
    ///
117 117
    ///The type of the map that stores the predecessor
118 118
    ///arcs of the shortest paths.
119 119
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
120 120
    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
121 121
    ///Instantiates a \c PredMap.
122 122

	
123 123
    ///This function instantiates a \ref PredMap.
124 124
    ///\param g is the digraph, to which we would like to define the
125 125
    ///\ref PredMap.
126 126
    static PredMap *createPredMap(const Digraph &g)
127 127
    {
128 128
      return new PredMap(g);
129 129
    }
130 130

	
131 131
    ///The type of the map that indicates which nodes are processed.
132 132

	
133 133
    ///The type of the map that indicates which nodes are processed.
134 134
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
135 135
    ///By default it is a NullMap.
136 136
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
137 137
    ///Instantiates a \c ProcessedMap.
138 138

	
139 139
    ///This function instantiates a \ref ProcessedMap.
140 140
    ///\param g is the digraph, to which
141 141
    ///we would like to define the \ref ProcessedMap.
142 142
#ifdef DOXYGEN
143 143
    static ProcessedMap *createProcessedMap(const Digraph &g)
144 144
#else
145 145
    static ProcessedMap *createProcessedMap(const Digraph &)
146 146
#endif
147 147
    {
148 148
      return new ProcessedMap();
149 149
    }
150 150

	
151 151
    ///The type of the map that stores the distances of the nodes.
152 152

	
153 153
    ///The type of the map that stores the distances of the nodes.
154 154
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
155 155
    typedef typename Digraph::template NodeMap<typename LEN::Value> DistMap;
156 156
    ///Instantiates a \c DistMap.
157 157

	
158 158
    ///This function instantiates a \ref DistMap.
159 159
    ///\param g is the digraph, to which we would like to define
160 160
    ///the \ref DistMap.
161 161
    static DistMap *createDistMap(const Digraph &g)
162 162
    {
163 163
      return new DistMap(g);
164 164
    }
165 165
  };
166 166

	
167 167
  ///%Dijkstra algorithm class.
168 168

	
169 169
  /// \ingroup shortest_path
170 170
  ///This class provides an efficient implementation of the %Dijkstra algorithm.
171 171
  ///
172 172
  ///The %Dijkstra algorithm solves the single-source shortest path problem
173 173
  ///when all arc lengths are non-negative. If there are negative lengths,
174 174
  ///the BellmanFord algorithm should be used instead.
175 175
  ///
176 176
  ///The arc lengths are passed to the algorithm using a
177 177
  ///\ref concepts::ReadMap "ReadMap",
178 178
  ///so it is easy to change it to any kind of length.
179 179
  ///The type of the length is determined by the
180 180
  ///\ref concepts::ReadMap::Value "Value" of the length map.
181 181
  ///It is also possible to change the underlying priority heap.
182 182
  ///
183 183
  ///There is also a \ref dijkstra() "function-type interface" for the
184 184
  ///%Dijkstra algorithm, which is convenient in the simplier cases and
185 185
  ///it can be used easier.
186 186
  ///
187 187
  ///\tparam GR The type of the digraph the algorithm runs on.
188 188
  ///The default type is \ref ListDigraph.
189 189
  ///\tparam LEN A \ref concepts::ReadMap "readable" arc map that specifies
190 190
  ///the lengths of the arcs.
191 191
  ///It is read once for each arc, so the map may involve in
192 192
  ///relatively time consuming process to compute the arc lengths if
193 193
  ///it is necessary. The default map type is \ref
194 194
  ///concepts::Digraph::ArcMap "GR::ArcMap<int>".
195 195
#ifdef DOXYGEN
196 196
  template <typename GR, typename LEN, typename TR>
197 197
#else
198 198
  template <typename GR=ListDigraph,
199 199
            typename LEN=typename GR::template ArcMap<int>,
200 200
            typename TR=DijkstraDefaultTraits<GR,LEN> >
201 201
#endif
202 202
  class Dijkstra {
203 203
  public:
204 204

	
205 205
    ///The type of the digraph the algorithm runs on.
206 206
    typedef typename TR::Digraph Digraph;
207 207

	
208 208
    ///The type of the arc lengths.
209
    typedef typename TR::LengthMap::Value Value;
209
    typedef typename TR::Value Value;
210 210
    ///The type of the map that stores the arc lengths.
211 211
    typedef typename TR::LengthMap LengthMap;
212 212
    ///\brief The type of the map that stores the predecessor arcs of the
213 213
    ///shortest paths.
214 214
    typedef typename TR::PredMap PredMap;
215 215
    ///The type of the map that stores the distances of the nodes.
216 216
    typedef typename TR::DistMap DistMap;
217 217
    ///The type of the map that indicates which nodes are processed.
218 218
    typedef typename TR::ProcessedMap ProcessedMap;
219 219
    ///The type of the paths.
220 220
    typedef PredMapPath<Digraph, PredMap> Path;
221 221
    ///The cross reference type used for the current heap.
222 222
    typedef typename TR::HeapCrossRef HeapCrossRef;
223 223
    ///The heap type used by the algorithm.
224 224
    typedef typename TR::Heap Heap;
225 225
    ///\brief The \ref DijkstraDefaultOperationTraits "operation traits class"
226 226
    ///of the algorithm.
227 227
    typedef typename TR::OperationTraits OperationTraits;
228 228

	
229 229
    ///The \ref DijkstraDefaultTraits "traits class" of the algorithm.
230 230
    typedef TR Traits;
231 231

	
232 232
  private:
233 233

	
234 234
    typedef typename Digraph::Node Node;
235 235
    typedef typename Digraph::NodeIt NodeIt;
236 236
    typedef typename Digraph::Arc Arc;
237 237
    typedef typename Digraph::OutArcIt OutArcIt;
238 238

	
239 239
    //Pointer to the underlying digraph.
240 240
    const Digraph *G;
241 241
    //Pointer to the length map.
242 242
    const LengthMap *_length;
243 243
    //Pointer to the map of predecessors arcs.
244 244
    PredMap *_pred;
245 245
    //Indicates if _pred is locally allocated (true) or not.
246 246
    bool local_pred;
247 247
    //Pointer to the map of distances.
248 248
    DistMap *_dist;
249 249
    //Indicates if _dist is locally allocated (true) or not.
250 250
    bool local_dist;
251 251
    //Pointer to the map of processed status of the nodes.
252 252
    ProcessedMap *_processed;
253 253
    //Indicates if _processed is locally allocated (true) or not.
254 254
    bool local_processed;
255 255
    //Pointer to the heap cross references.
256 256
    HeapCrossRef *_heap_cross_ref;
257 257
    //Indicates if _heap_cross_ref is locally allocated (true) or not.
258 258
    bool local_heap_cross_ref;
259 259
    //Pointer to the heap.
260 260
    Heap *_heap;
261 261
    //Indicates if _heap is locally allocated (true) or not.
262 262
    bool local_heap;
263 263

	
264 264
    //Creates the maps if necessary.
265 265
    void create_maps()
266 266
    {
267 267
      if(!_pred) {
268 268
        local_pred = true;
269 269
        _pred = Traits::createPredMap(*G);
270 270
      }
271 271
      if(!_dist) {
272 272
        local_dist = true;
273 273
        _dist = Traits::createDistMap(*G);
274 274
      }
275 275
      if(!_processed) {
276 276
        local_processed = true;
277 277
        _processed = Traits::createProcessedMap(*G);
278 278
      }
279 279
      if (!_heap_cross_ref) {
280 280
        local_heap_cross_ref = true;
281 281
        _heap_cross_ref = Traits::createHeapCrossRef(*G);
282 282
      }
283 283
      if (!_heap) {
284 284
        local_heap = true;
285 285
        _heap = Traits::createHeap(*_heap_cross_ref);
286 286
      }
287 287
    }
288 288

	
289 289
  public:
290 290

	
291 291
    typedef Dijkstra Create;
292 292

	
293 293
    ///\name Named Template Parameters
294 294

	
295 295
    ///@{
296 296

	
297 297
    template <class T>
298 298
    struct SetPredMapTraits : public Traits {
299 299
      typedef T PredMap;
300 300
      static PredMap *createPredMap(const Digraph &)
301 301
      {
302 302
        LEMON_ASSERT(false, "PredMap is not initialized");
303 303
        return 0; // ignore warnings
304 304
      }
305 305
    };
306 306
    ///\brief \ref named-templ-param "Named parameter" for setting
307 307
    ///\c PredMap type.
308 308
    ///
309 309
    ///\ref named-templ-param "Named parameter" for setting
310 310
    ///\c PredMap type.
311 311
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
312 312
    template <class T>
313 313
    struct SetPredMap
314 314
      : public Dijkstra< Digraph, LengthMap, SetPredMapTraits<T> > {
315 315
      typedef Dijkstra< Digraph, LengthMap, SetPredMapTraits<T> > Create;
316 316
    };
317 317

	
318 318
    template <class T>
319 319
    struct SetDistMapTraits : public Traits {
320 320
      typedef T DistMap;
321 321
      static DistMap *createDistMap(const Digraph &)
322 322
      {
323 323
        LEMON_ASSERT(false, "DistMap is not initialized");
324 324
        return 0; // ignore warnings
325 325
      }
326 326
    };
327 327
    ///\brief \ref named-templ-param "Named parameter" for setting
328 328
    ///\c DistMap type.
329 329
    ///
330 330
    ///\ref named-templ-param "Named parameter" for setting
331 331
    ///\c DistMap type.
332 332
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
333 333
    template <class T>
334 334
    struct SetDistMap
335 335
      : public Dijkstra< Digraph, LengthMap, SetDistMapTraits<T> > {
336 336
      typedef Dijkstra< Digraph, LengthMap, SetDistMapTraits<T> > Create;
337 337
    };
338 338

	
339 339
    template <class T>
340 340
    struct SetProcessedMapTraits : public Traits {
341 341
      typedef T ProcessedMap;
342 342
      static ProcessedMap *createProcessedMap(const Digraph &)
343 343
      {
344 344
        LEMON_ASSERT(false, "ProcessedMap is not initialized");
345 345
        return 0; // ignore warnings
346 346
      }
347 347
    };
348 348
    ///\brief \ref named-templ-param "Named parameter" for setting
349 349
    ///\c ProcessedMap type.
350 350
    ///
351 351
    ///\ref named-templ-param "Named parameter" for setting
352 352
    ///\c ProcessedMap type.
353 353
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
354 354
    template <class T>
355 355
    struct SetProcessedMap
356 356
      : public Dijkstra< Digraph, LengthMap, SetProcessedMapTraits<T> > {
357 357
      typedef Dijkstra< Digraph, LengthMap, SetProcessedMapTraits<T> > Create;
358 358
    };
359 359

	
360 360
    struct SetStandardProcessedMapTraits : public Traits {
361 361
      typedef typename Digraph::template NodeMap<bool> ProcessedMap;
362 362
      static ProcessedMap *createProcessedMap(const Digraph &g)
363 363
      {
364 364
        return new ProcessedMap(g);
365 365
      }
366 366
    };
367 367
    ///\brief \ref named-templ-param "Named parameter" for setting
368 368
    ///\c ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
369 369
    ///
370 370
    ///\ref named-templ-param "Named parameter" for setting
371 371
    ///\c ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
372 372
    ///If you don't set it explicitly, it will be automatically allocated.
373 373
    struct SetStandardProcessedMap
374 374
      : public Dijkstra< Digraph, LengthMap, SetStandardProcessedMapTraits > {
375 375
      typedef Dijkstra< Digraph, LengthMap, SetStandardProcessedMapTraits >
376 376
      Create;
377 377
    };
378 378

	
379 379
    template <class H, class CR>
380 380
    struct SetHeapTraits : public Traits {
381 381
      typedef CR HeapCrossRef;
382 382
      typedef H Heap;
383 383
      static HeapCrossRef *createHeapCrossRef(const Digraph &) {
384 384
        LEMON_ASSERT(false, "HeapCrossRef is not initialized");
385 385
        return 0; // ignore warnings
386 386
      }
387 387
      static Heap *createHeap(HeapCrossRef &)
388 388
      {
389 389
        LEMON_ASSERT(false, "Heap is not initialized");
390 390
        return 0; // ignore warnings
391 391
      }
392 392
    };
393 393
    ///\brief \ref named-templ-param "Named parameter" for setting
394 394
    ///heap and cross reference types
395 395
    ///
396 396
    ///\ref named-templ-param "Named parameter" for setting heap and cross
397 397
    ///reference types. If this named parameter is used, then external
398 398
    ///heap and cross reference objects must be passed to the algorithm
399 399
    ///using the \ref heap() function before calling \ref run(Node) "run()"
400 400
    ///or \ref init().
401 401
    ///\sa SetStandardHeap
Show white space 384 line context
... ...
@@ -66,391 +66,392 @@
66 66
      _graph = &graph;
67 67
      _nodes = &nodes;
68 68
    }
69 69

	
70 70
  public:
71 71

	
72 72
    class Arc {
73 73
      friend class ListArcSetBase<GR>;
74 74
    protected:
75 75
      Arc(int _id) : id(_id) {}
76 76
      int id;
77 77
    public:
78 78
      Arc() {}
79 79
      Arc(Invalid) : id(-1) {}
80 80
      bool operator==(const Arc& arc) const { return id == arc.id; }
81 81
      bool operator!=(const Arc& arc) const { return id != arc.id; }
82 82
      bool operator<(const Arc& arc) const { return id < arc.id; }
83 83
    };
84 84

	
85 85
    ListArcSetBase() : first_arc(-1), first_free_arc(-1) {}
86 86

	
87 87
    Node addNode() {
88 88
      LEMON_ASSERT(false,
89 89
        "This graph structure does not support node insertion");
90 90
      return INVALID; // avoid warning
91 91
    }
92 92

	
93 93
    Arc addArc(const Node& u, const Node& v) {
94 94
      int n;
95 95
      if (first_free_arc == -1) {
96 96
        n = arcs.size();
97 97
        arcs.push_back(ArcT());
98 98
      } else {
99 99
        n = first_free_arc;
100 100
        first_free_arc = arcs[first_free_arc].next_in;
101 101
      }
102 102
      arcs[n].next_in = (*_nodes)[v].first_in;
103 103
      if ((*_nodes)[v].first_in != -1) {
104 104
        arcs[(*_nodes)[v].first_in].prev_in = n;
105 105
      }
106 106
      (*_nodes)[v].first_in = n;
107 107
      arcs[n].next_out = (*_nodes)[u].first_out;
108 108
      if ((*_nodes)[u].first_out != -1) {
109 109
        arcs[(*_nodes)[u].first_out].prev_out = n;
110 110
      }
111 111
      (*_nodes)[u].first_out = n;
112 112
      arcs[n].source = u;
113 113
      arcs[n].target = v;
114 114
      return Arc(n);
115 115
    }
116 116

	
117 117
    void erase(const Arc& arc) {
118 118
      int n = arc.id;
119 119
      if (arcs[n].prev_in != -1) {
120 120
        arcs[arcs[n].prev_in].next_in = arcs[n].next_in;
121 121
      } else {
122 122
        (*_nodes)[arcs[n].target].first_in = arcs[n].next_in;
123 123
      }
124 124
      if (arcs[n].next_in != -1) {
125 125
        arcs[arcs[n].next_in].prev_in = arcs[n].prev_in;
126 126
      }
127 127

	
128 128
      if (arcs[n].prev_out != -1) {
129 129
        arcs[arcs[n].prev_out].next_out = arcs[n].next_out;
130 130
      } else {
131 131
        (*_nodes)[arcs[n].source].first_out = arcs[n].next_out;
132 132
      }
133 133
      if (arcs[n].next_out != -1) {
134 134
        arcs[arcs[n].next_out].prev_out = arcs[n].prev_out;
135 135
      }
136 136

	
137 137
    }
138 138

	
139 139
    void clear() {
140 140
      Node node;
141 141
      for (first(node); node != INVALID; next(node)) {
142 142
        (*_nodes)[node].first_in = -1;
143 143
        (*_nodes)[node].first_out = -1;
144 144
      }
145 145
      arcs.clear();
146 146
      first_arc = -1;
147 147
      first_free_arc = -1;
148 148
    }
149 149

	
150 150
    void first(Node& node) const {
151 151
      _graph->first(node);
152 152
    }
153 153

	
154 154
    void next(Node& node) const {
155 155
      _graph->next(node);
156 156
    }
157 157

	
158 158
    void first(Arc& arc) const {
159 159
      Node node;
160 160
      first(node);
161 161
      while (node != INVALID && (*_nodes)[node].first_in == -1) {
162 162
        next(node);
163 163
      }
164 164
      arc.id = (node == INVALID) ? -1 : (*_nodes)[node].first_in;
165 165
    }
166 166

	
167 167
    void next(Arc& arc) const {
168 168
      if (arcs[arc.id].next_in != -1) {
169 169
        arc.id = arcs[arc.id].next_in;
170 170
      } else {
171 171
        Node node = arcs[arc.id].target;
172 172
        next(node);
173 173
        while (node != INVALID && (*_nodes)[node].first_in == -1) {
174 174
          next(node);
175 175
        }
176 176
        arc.id = (node == INVALID) ? -1 : (*_nodes)[node].first_in;
177 177
      }
178 178
    }
179 179

	
180 180
    void firstOut(Arc& arc, const Node& node) const {
181 181
      arc.id = (*_nodes)[node].first_out;
182 182
    }
183 183

	
184 184
    void nextOut(Arc& arc) const {
185 185
      arc.id = arcs[arc.id].next_out;
186 186
    }
187 187

	
188 188
    void firstIn(Arc& arc, const Node& node) const {
189 189
      arc.id = (*_nodes)[node].first_in;
190 190
    }
191 191

	
192 192
    void nextIn(Arc& arc) const {
193 193
      arc.id = arcs[arc.id].next_in;
194 194
    }
195 195

	
196 196
    int id(const Node& node) const { return _graph->id(node); }
197 197
    int id(const Arc& arc) const { return arc.id; }
198 198

	
199 199
    Node nodeFromId(int ix) const { return _graph->nodeFromId(ix); }
200 200
    Arc arcFromId(int ix) const { return Arc(ix); }
201 201

	
202 202
    int maxNodeId() const { return _graph->maxNodeId(); };
203 203
    int maxArcId() const { return arcs.size() - 1; }
204 204

	
205 205
    Node source(const Arc& arc) const { return arcs[arc.id].source;}
206 206
    Node target(const Arc& arc) const { return arcs[arc.id].target;}
207 207

	
208 208
    typedef typename ItemSetTraits<GR, Node>::ItemNotifier NodeNotifier;
209 209

	
210 210
    NodeNotifier& notifier(Node) const {
211 211
      return _graph->notifier(Node());
212 212
    }
213 213

	
214 214
    template <typename V>
215 215
    class NodeMap : public GR::template NodeMap<V> {
216 216
      typedef typename GR::template NodeMap<V> Parent;
217 217

	
218 218
    public:
219 219

	
220 220
      explicit NodeMap(const ListArcSetBase<GR>& arcset)
221 221
        : Parent(*arcset._graph) {}
222 222

	
223 223
      NodeMap(const ListArcSetBase<GR>& arcset, const V& value)
224 224
        : Parent(*arcset._graph, value) {}
225 225

	
226 226
      NodeMap& operator=(const NodeMap& cmap) {
227 227
        return operator=<NodeMap>(cmap);
228 228
      }
229 229

	
230 230
      template <typename CMap>
231 231
      NodeMap& operator=(const CMap& cmap) {
232 232
        Parent::operator=(cmap);
233 233
        return *this;
234 234
      }
235 235
    };
236 236

	
237 237
  };
238 238

	
239 239
  /// \ingroup graphs
240 240
  ///
241 241
  /// \brief Digraph using a node set of another digraph or graph and
242 242
  /// an own arc set.
243 243
  ///
244 244
  /// This structure can be used to establish another directed graph
245 245
  /// over a node set of an existing one. This class uses the same
246 246
  /// Node type as the underlying graph, and each valid node of the
247 247
  /// original graph is valid in this arc set, therefore the node
248 248
  /// objects of the original graph can be used directly with this
249 249
  /// class. The node handling functions (id handling, observing, and
250 250
  /// iterators) works equivalently as in the original graph.
251 251
  ///
252 252
  /// This implementation is based on doubly-linked lists, from each
253 253
  /// node the outgoing and the incoming arcs make up lists, therefore
254 254
  /// one arc can be erased in constant time. It also makes possible,
255 255
  /// that node can be removed from the underlying graph, in this case
256 256
  /// all arcs incident to the given node is erased from the arc set.
257 257
  ///
258
  /// This class fully conforms to the \ref concepts::Digraph
259
  /// "Digraph" concept.
260
  /// It provides only linear time counting for nodes and arcs.
261
  ///
258 262
  /// \param GR The type of the graph which shares its node set with
259 263
  /// this class. Its interface must conform to the
260 264
  /// \ref concepts::Digraph "Digraph" or \ref concepts::Graph "Graph"
261 265
  /// concept.
262
  ///
263
  /// This class fully conforms to the \ref concepts::Digraph
264
  /// "Digraph" concept.
265 266
  template <typename GR>
266 267
  class ListArcSet : public ArcSetExtender<ListArcSetBase<GR> > {
267 268
    typedef ArcSetExtender<ListArcSetBase<GR> > Parent;
268 269

	
269 270
  public:
270 271

	
271 272
    typedef typename Parent::Node Node;
272 273
    typedef typename Parent::Arc Arc;
273 274

	
274 275
    typedef typename Parent::NodesImplBase NodesImplBase;
275 276

	
276 277
    void eraseNode(const Node& node) {
277 278
      Arc arc;
278 279
      Parent::firstOut(arc, node);
279 280
      while (arc != INVALID ) {
280 281
        erase(arc);
281 282
        Parent::firstOut(arc, node);
282 283
      }
283 284

	
284 285
      Parent::firstIn(arc, node);
285 286
      while (arc != INVALID ) {
286 287
        erase(arc);
287 288
        Parent::firstIn(arc, node);
288 289
      }
289 290
    }
290 291

	
291 292
    void clearNodes() {
292 293
      Parent::clear();
293 294
    }
294 295

	
295 296
    class NodesImpl : public NodesImplBase {
296 297
      typedef NodesImplBase Parent;
297 298

	
298 299
    public:
299 300
      NodesImpl(const GR& graph, ListArcSet& arcset)
300 301
        : Parent(graph), _arcset(arcset) {}
301 302

	
302 303
      virtual ~NodesImpl() {}
303 304

	
304 305
    protected:
305 306

	
306 307
      virtual void erase(const Node& node) {
307 308
        _arcset.eraseNode(node);
308 309
        Parent::erase(node);
309 310
      }
310 311
      virtual void erase(const std::vector<Node>& nodes) {
311 312
        for (int i = 0; i < int(nodes.size()); ++i) {
312 313
          _arcset.eraseNode(nodes[i]);
313 314
        }
314 315
        Parent::erase(nodes);
315 316
      }
316 317
      virtual void clear() {
317 318
        _arcset.clearNodes();
318 319
        Parent::clear();
319 320
      }
320 321

	
321 322
    private:
322 323
      ListArcSet& _arcset;
323 324
    };
324 325

	
325 326
    NodesImpl _nodes;
326 327

	
327 328
  public:
328 329

	
329 330
    /// \brief Constructor of the ArcSet.
330 331
    ///
331 332
    /// Constructor of the ArcSet.
332 333
    ListArcSet(const GR& graph) : _nodes(graph, *this) {
333 334
      Parent::initalize(graph, _nodes);
334 335
    }
335 336

	
336 337
    /// \brief Add a new arc to the digraph.
337 338
    ///
338 339
    /// Add a new arc to the digraph with source node \c s
339 340
    /// and target node \c t.
340 341
    /// \return The new arc.
341 342
    Arc addArc(const Node& s, const Node& t) {
342 343
      return Parent::addArc(s, t);
343 344
    }
344 345

	
345 346
    /// \brief Erase an arc from the digraph.
346 347
    ///
347 348
    /// Erase an arc \c a from the digraph.
348 349
    void erase(const Arc& a) {
349 350
      return Parent::erase(a);
350 351
    }
351 352

	
352 353
  };
353 354

	
354 355
  template <typename GR>
355 356
  class ListEdgeSetBase {
356 357
  public:
357 358

	
358 359
    typedef typename GR::Node Node;
359 360
    typedef typename GR::NodeIt NodeIt;
360 361

	
361 362
  protected:
362 363

	
363 364
    struct NodeT {
364 365
      int first_out;
365 366
      NodeT() : first_out(-1) {}
366 367
    };
367 368

	
368 369
    typedef typename ItemSetTraits<GR, Node>::
369 370
    template Map<NodeT>::Type NodesImplBase;
370 371

	
371 372
    NodesImplBase* _nodes;
372 373

	
373 374
    struct ArcT {
374 375
      Node target;
375 376
      int prev_out, next_out;
376 377
      ArcT() : prev_out(-1), next_out(-1) {}
377 378
    };
378 379

	
379 380
    std::vector<ArcT> arcs;
380 381

	
381 382
    int first_arc;
382 383
    int first_free_arc;
383 384

	
384 385
    const GR* _graph;
385 386

	
386 387
    void initalize(const GR& graph, NodesImplBase& nodes) {
387 388
      _graph = &graph;
388 389
      _nodes = &nodes;
389 390
    }
390 391

	
391 392
  public:
392 393

	
393 394
    class Edge {
394 395
      friend class ListEdgeSetBase;
395 396
    protected:
396 397

	
397 398
      int id;
398 399
      explicit Edge(int _id) { id = _id;}
399 400

	
400 401
    public:
401 402
      Edge() {}
402 403
      Edge (Invalid) { id = -1; }
403 404
      bool operator==(const Edge& arc) const {return id == arc.id;}
404 405
      bool operator!=(const Edge& arc) const {return id != arc.id;}
405 406
      bool operator<(const Edge& arc) const {return id < arc.id;}
406 407
    };
407 408

	
408 409
    class Arc {
409 410
      friend class ListEdgeSetBase;
410 411
    protected:
411 412
      Arc(int _id) : id(_id) {}
412 413
      int id;
413 414
    public:
414 415
      operator Edge() const { return edgeFromId(id / 2); }
415 416

	
416 417
      Arc() {}
417 418
      Arc(Invalid) : id(-1) {}
418 419
      bool operator==(const Arc& arc) const { return id == arc.id; }
419 420
      bool operator!=(const Arc& arc) const { return id != arc.id; }
420 421
      bool operator<(const Arc& arc) const { return id < arc.id; }
421 422
    };
422 423

	
423 424
    ListEdgeSetBase() : first_arc(-1), first_free_arc(-1) {}
424 425

	
425 426
    Node addNode() {
426 427
      LEMON_ASSERT(false,
427 428
        "This graph structure does not support node insertion");
428 429
      return INVALID; // avoid warning
429 430
    }
430 431

	
431 432
    Edge addEdge(const Node& u, const Node& v) {
432 433
      int n;
433 434

	
434 435
      if (first_free_arc == -1) {
435 436
        n = arcs.size();
436 437
        arcs.push_back(ArcT());
437 438
        arcs.push_back(ArcT());
438 439
      } else {
439 440
        n = first_free_arc;
440 441
        first_free_arc = arcs[n].next_out;
441 442
      }
442 443

	
443 444
      arcs[n].target = u;
444 445
      arcs[n | 1].target = v;
445 446

	
446 447
      arcs[n].next_out = (*_nodes)[v].first_out;
447 448
      if ((*_nodes)[v].first_out != -1) {
448 449
        arcs[(*_nodes)[v].first_out].prev_out = n;
449 450
      }
450 451
      (*_nodes)[v].first_out = n;
451 452
      arcs[n].prev_out = -1;
452 453

	
453 454
      if ((*_nodes)[u].first_out != -1) {
454 455
        arcs[(*_nodes)[u].first_out].prev_out = (n | 1);
455 456
      }
456 457
      arcs[n | 1].next_out = (*_nodes)[u].first_out;
... ...
@@ -496,921 +497,924 @@
496 497
      arcs.clear();
497 498
      first_arc = -1;
498 499
      first_free_arc = -1;
499 500
    }
500 501

	
501 502
    void first(Node& node) const {
502 503
      _graph->first(node);
503 504
    }
504 505

	
505 506
    void next(Node& node) const {
506 507
      _graph->next(node);
507 508
    }
508 509

	
509 510
    void first(Arc& arc) const {
510 511
      Node node;
511 512
      first(node);
512 513
      while (node != INVALID && (*_nodes)[node].first_out == -1) {
513 514
        next(node);
514 515
      }
515 516
      arc.id = (node == INVALID) ? -1 : (*_nodes)[node].first_out;
516 517
    }
517 518

	
518 519
    void next(Arc& arc) const {
519 520
      if (arcs[arc.id].next_out != -1) {
520 521
        arc.id = arcs[arc.id].next_out;
521 522
      } else {
522 523
        Node node = arcs[arc.id ^ 1].target;
523 524
        next(node);
524 525
        while(node != INVALID && (*_nodes)[node].first_out == -1) {
525 526
          next(node);
526 527
        }
527 528
        arc.id = (node == INVALID) ? -1 : (*_nodes)[node].first_out;
528 529
      }
529 530
    }
530 531

	
531 532
    void first(Edge& edge) const {
532 533
      Node node;
533 534
      first(node);
534 535
      while (node != INVALID) {
535 536
        edge.id = (*_nodes)[node].first_out;
536 537
        while ((edge.id & 1) != 1) {
537 538
          edge.id = arcs[edge.id].next_out;
538 539
        }
539 540
        if (edge.id != -1) {
540 541
          edge.id /= 2;
541 542
          return;
542 543
        }
543 544
        next(node);
544 545
      }
545 546
      edge.id = -1;
546 547
    }
547 548

	
548 549
    void next(Edge& edge) const {
549 550
      Node node = arcs[edge.id * 2].target;
550 551
      edge.id = arcs[(edge.id * 2) | 1].next_out;
551 552
      while ((edge.id & 1) != 1) {
552 553
        edge.id = arcs[edge.id].next_out;
553 554
      }
554 555
      if (edge.id != -1) {
555 556
        edge.id /= 2;
556 557
        return;
557 558
      }
558 559
      next(node);
559 560
      while (node != INVALID) {
560 561
        edge.id = (*_nodes)[node].first_out;
561 562
        while ((edge.id & 1) != 1) {
562 563
          edge.id = arcs[edge.id].next_out;
563 564
        }
564 565
        if (edge.id != -1) {
565 566
          edge.id /= 2;
566 567
          return;
567 568
        }
568 569
        next(node);
569 570
      }
570 571
      edge.id = -1;
571 572
    }
572 573

	
573 574
    void firstOut(Arc& arc, const Node& node) const {
574 575
      arc.id = (*_nodes)[node].first_out;
575 576
    }
576 577

	
577 578
    void nextOut(Arc& arc) const {
578 579
      arc.id = arcs[arc.id].next_out;
579 580
    }
580 581

	
581 582
    void firstIn(Arc& arc, const Node& node) const {
582 583
      arc.id = (((*_nodes)[node].first_out) ^ 1);
583 584
      if (arc.id == -2) arc.id = -1;
584 585
    }
585 586

	
586 587
    void nextIn(Arc& arc) const {
587 588
      arc.id = ((arcs[arc.id ^ 1].next_out) ^ 1);
588 589
      if (arc.id == -2) arc.id = -1;
589 590
    }
590 591

	
591 592
    void firstInc(Edge &arc, bool& dir, const Node& node) const {
592 593
      int de = (*_nodes)[node].first_out;
593 594
      if (de != -1 ) {
594 595
        arc.id = de / 2;
595 596
        dir = ((de & 1) == 1);
596 597
      } else {
597 598
        arc.id = -1;
598 599
        dir = true;
599 600
      }
600 601
    }
601 602
    void nextInc(Edge &arc, bool& dir) const {
602 603
      int de = (arcs[(arc.id * 2) | (dir ? 1 : 0)].next_out);
603 604
      if (de != -1 ) {
604 605
        arc.id = de / 2;
605 606
        dir = ((de & 1) == 1);
606 607
      } else {
607 608
        arc.id = -1;
608 609
        dir = true;
609 610
      }
610 611
    }
611 612

	
612 613
    static bool direction(Arc arc) {
613 614
      return (arc.id & 1) == 1;
614 615
    }
615 616

	
616 617
    static Arc direct(Edge edge, bool dir) {
617 618
      return Arc(edge.id * 2 + (dir ? 1 : 0));
618 619
    }
619 620

	
620 621
    int id(const Node& node) const { return _graph->id(node); }
621 622
    static int id(Arc e) { return e.id; }
622 623
    static int id(Edge e) { return e.id; }
623 624

	
624 625
    Node nodeFromId(int id) const { return _graph->nodeFromId(id); }
625 626
    static Arc arcFromId(int id) { return Arc(id);}
626 627
    static Edge edgeFromId(int id) { return Edge(id);}
627 628

	
628 629
    int maxNodeId() const { return _graph->maxNodeId(); };
629 630
    int maxEdgeId() const { return arcs.size() / 2 - 1; }
630 631
    int maxArcId() const { return arcs.size()-1; }
631 632

	
632 633
    Node source(Arc e) const { return arcs[e.id ^ 1].target; }
633 634
    Node target(Arc e) const { return arcs[e.id].target; }
634 635

	
635 636
    Node u(Edge e) const { return arcs[2 * e.id].target; }
636 637
    Node v(Edge e) const { return arcs[2 * e.id + 1].target; }
637 638

	
638 639
    typedef typename ItemSetTraits<GR, Node>::ItemNotifier NodeNotifier;
639 640

	
640 641
    NodeNotifier& notifier(Node) const {
641 642
      return _graph->notifier(Node());
642 643
    }
643 644

	
644 645
    template <typename V>
645 646
    class NodeMap : public GR::template NodeMap<V> {
646 647
      typedef typename GR::template NodeMap<V> Parent;
647 648

	
648 649
    public:
649 650

	
650 651
      explicit NodeMap(const ListEdgeSetBase<GR>& arcset)
651 652
        : Parent(*arcset._graph) {}
652 653

	
653 654
      NodeMap(const ListEdgeSetBase<GR>& arcset, const V& value)
654 655
        : Parent(*arcset._graph, value) {}
655 656

	
656 657
      NodeMap& operator=(const NodeMap& cmap) {
657 658
        return operator=<NodeMap>(cmap);
658 659
      }
659 660

	
660 661
      template <typename CMap>
661 662
      NodeMap& operator=(const CMap& cmap) {
662 663
        Parent::operator=(cmap);
663 664
        return *this;
664 665
      }
665 666
    };
666 667

	
667 668
  };
668 669

	
669 670
  /// \ingroup graphs
670 671
  ///
671 672
  /// \brief Graph using a node set of another digraph or graph and an
672 673
  /// own edge set.
673 674
  ///
674 675
  /// This structure can be used to establish another graph over a
675 676
  /// node set of an existing one. This class uses the same Node type
676 677
  /// as the underlying graph, and each valid node of the original
677 678
  /// graph is valid in this arc set, therefore the node objects of
678 679
  /// the original graph can be used directly with this class. The
679 680
  /// node handling functions (id handling, observing, and iterators)
680 681
  /// works equivalently as in the original graph.
681 682
  ///
682 683
  /// This implementation is based on doubly-linked lists, from each
683 684
  /// node the incident edges make up lists, therefore one edge can be
684 685
  /// erased in constant time. It also makes possible, that node can
685 686
  /// be removed from the underlying graph, in this case all edges
686 687
  /// incident to the given node is erased from the arc set.
687 688
  ///
689
  /// This class fully conforms to the \ref concepts::Graph "Graph"
690
  /// concept.
691
  /// It provides only linear time counting for nodes, edges and arcs.
692
  ///
688 693
  /// \param GR The type of the graph which shares its node set
689 694
  /// with this class. Its interface must conform to the
690 695
  /// \ref concepts::Digraph "Digraph" or \ref concepts::Graph "Graph"
691 696
  /// concept.
692
  ///
693
  /// This class fully conforms to the \ref concepts::Graph "Graph"
694
  /// concept.
695 697
  template <typename GR>
696 698
  class ListEdgeSet : public EdgeSetExtender<ListEdgeSetBase<GR> > {
697 699
    typedef EdgeSetExtender<ListEdgeSetBase<GR> > Parent;
698 700

	
699 701
  public:
700 702

	
701 703
    typedef typename Parent::Node Node;
702 704
    typedef typename Parent::Arc Arc;
703 705
    typedef typename Parent::Edge Edge;
704 706

	
705 707
    typedef typename Parent::NodesImplBase NodesImplBase;
706 708

	
707 709
    void eraseNode(const Node& node) {
708 710
      Arc arc;
709 711
      Parent::firstOut(arc, node);
710 712
      while (arc != INVALID ) {
711 713
        erase(arc);
712 714
        Parent::firstOut(arc, node);
713 715
      }
714 716

	
715 717
    }
716 718

	
717 719
    void clearNodes() {
718 720
      Parent::clear();
719 721
    }
720 722

	
721 723
    class NodesImpl : public NodesImplBase {
722 724
      typedef NodesImplBase Parent;
723 725

	
724 726
    public:
725 727
      NodesImpl(const GR& graph, ListEdgeSet& arcset)
726 728
        : Parent(graph), _arcset(arcset) {}
727 729

	
728 730
      virtual ~NodesImpl() {}
729 731

	
730 732
    protected:
731 733

	
732 734
      virtual void erase(const Node& node) {
733 735
        _arcset.eraseNode(node);
734 736
        Parent::erase(node);
735 737
      }
736 738
      virtual void erase(const std::vector<Node>& nodes) {
737 739
        for (int i = 0; i < int(nodes.size()); ++i) {
738 740
          _arcset.eraseNode(nodes[i]);
739 741
        }
740 742
        Parent::erase(nodes);
741 743
      }
742 744
      virtual void clear() {
743 745
        _arcset.clearNodes();
744 746
        Parent::clear();
745 747
      }
746 748

	
747 749
    private:
748 750
      ListEdgeSet& _arcset;
749 751
    };
750 752

	
751 753
    NodesImpl _nodes;
752 754

	
753 755
  public:
754 756

	
755 757
    /// \brief Constructor of the EdgeSet.
756 758
    ///
757 759
    /// Constructor of the EdgeSet.
758 760
    ListEdgeSet(const GR& graph) : _nodes(graph, *this) {
759 761
      Parent::initalize(graph, _nodes);
760 762
    }
761 763

	
762 764
    /// \brief Add a new edge to the graph.
763 765
    ///
764 766
    /// Add a new edge to the graph with node \c u
765 767
    /// and node \c v endpoints.
766 768
    /// \return The new edge.
767 769
    Edge addEdge(const Node& u, const Node& v) {
768 770
      return Parent::addEdge(u, v);
769 771
    }
770 772

	
771 773
    /// \brief Erase an edge from the graph.
772 774
    ///
773 775
    /// Erase the edge \c e from the graph.
774 776
    void erase(const Edge& e) {
775 777
      return Parent::erase(e);
776 778
    }
777 779

	
778 780
  };
779 781

	
780 782
  template <typename GR>
781 783
  class SmartArcSetBase {
782 784
  public:
783 785

	
784 786
    typedef typename GR::Node Node;
785 787
    typedef typename GR::NodeIt NodeIt;
786 788

	
787 789
  protected:
788 790

	
789 791
    struct NodeT {
790 792
      int first_out, first_in;
791 793
      NodeT() : first_out(-1), first_in(-1) {}
792 794
    };
793 795

	
794 796
    typedef typename ItemSetTraits<GR, Node>::
795 797
    template Map<NodeT>::Type NodesImplBase;
796 798

	
797 799
    NodesImplBase* _nodes;
798 800

	
799 801
    struct ArcT {
800 802
      Node source, target;
801 803
      int next_out, next_in;
802 804
      ArcT() {}
803 805
    };
804 806

	
805 807
    std::vector<ArcT> arcs;
806 808

	
807 809
    const GR* _graph;
808 810

	
809 811
    void initalize(const GR& graph, NodesImplBase& nodes) {
810 812
      _graph = &graph;
811 813
      _nodes = &nodes;
812 814
    }
813 815

	
814 816
  public:
815 817

	
816 818
    class Arc {
817 819
      friend class SmartArcSetBase<GR>;
818 820
    protected:
819 821
      Arc(int _id) : id(_id) {}
820 822
      int id;
821 823
    public:
822 824
      Arc() {}
823 825
      Arc(Invalid) : id(-1) {}
824 826
      bool operator==(const Arc& arc) const { return id == arc.id; }
825 827
      bool operator!=(const Arc& arc) const { return id != arc.id; }
826 828
      bool operator<(const Arc& arc) const { return id < arc.id; }
827 829
    };
828 830

	
829 831
    SmartArcSetBase() {}
830 832

	
831 833
    Node addNode() {
832 834
      LEMON_ASSERT(false,
833 835
        "This graph structure does not support node insertion");
834 836
      return INVALID; // avoid warning
835 837
    }
836 838

	
837 839
    Arc addArc(const Node& u, const Node& v) {
838 840
      int n = arcs.size();
839 841
      arcs.push_back(ArcT());
840 842
      arcs[n].next_in = (*_nodes)[v].first_in;
841 843
      (*_nodes)[v].first_in = n;
842 844
      arcs[n].next_out = (*_nodes)[u].first_out;
843 845
      (*_nodes)[u].first_out = n;
844 846
      arcs[n].source = u;
845 847
      arcs[n].target = v;
846 848
      return Arc(n);
847 849
    }
848 850

	
849 851
    void clear() {
850 852
      Node node;
851 853
      for (first(node); node != INVALID; next(node)) {
852 854
        (*_nodes)[node].first_in = -1;
853 855
        (*_nodes)[node].first_out = -1;
854 856
      }
855 857
      arcs.clear();
856 858
    }
857 859

	
858 860
    void first(Node& node) const {
859 861
      _graph->first(node);
860 862
    }
861 863

	
862 864
    void next(Node& node) const {
863 865
      _graph->next(node);
864 866
    }
865 867

	
866 868
    void first(Arc& arc) const {
867 869
      arc.id = arcs.size() - 1;
868 870
    }
869 871

	
870 872
    static void next(Arc& arc) {
871 873
      --arc.id;
872 874
    }
873 875

	
874 876
    void firstOut(Arc& arc, const Node& node) const {
875 877
      arc.id = (*_nodes)[node].first_out;
876 878
    }
877 879

	
878 880
    void nextOut(Arc& arc) const {
879 881
      arc.id = arcs[arc.id].next_out;
880 882
    }
881 883

	
882 884
    void firstIn(Arc& arc, const Node& node) const {
883 885
      arc.id = (*_nodes)[node].first_in;
884 886
    }
885 887

	
886 888
    void nextIn(Arc& arc) const {
887 889
      arc.id = arcs[arc.id].next_in;
888 890
    }
889 891

	
890 892
    int id(const Node& node) const { return _graph->id(node); }
891 893
    int id(const Arc& arc) const { return arc.id; }
892 894

	
893 895
    Node nodeFromId(int ix) const { return _graph->nodeFromId(ix); }
894 896
    Arc arcFromId(int ix) const { return Arc(ix); }
895 897

	
896 898
    int maxNodeId() const { return _graph->maxNodeId(); };
897 899
    int maxArcId() const { return arcs.size() - 1; }
898 900

	
899 901
    Node source(const Arc& arc) const { return arcs[arc.id].source;}
900 902
    Node target(const Arc& arc) const { return arcs[arc.id].target;}
901 903

	
902 904
    typedef typename ItemSetTraits<GR, Node>::ItemNotifier NodeNotifier;
903 905

	
904 906
    NodeNotifier& notifier(Node) const {
905 907
      return _graph->notifier(Node());
906 908
    }
907 909

	
908 910
    template <typename V>
909 911
    class NodeMap : public GR::template NodeMap<V> {
910 912
      typedef typename GR::template NodeMap<V> Parent;
911 913

	
912 914
    public:
913 915

	
914 916
      explicit NodeMap(const SmartArcSetBase<GR>& arcset)
915 917
        : Parent(*arcset._graph) { }
916 918

	
917 919
      NodeMap(const SmartArcSetBase<GR>& arcset, const V& value)
918 920
        : Parent(*arcset._graph, value) { }
919 921

	
920 922
      NodeMap& operator=(const NodeMap& cmap) {
921 923
        return operator=<NodeMap>(cmap);
922 924
      }
923 925

	
924 926
      template <typename CMap>
925 927
      NodeMap& operator=(const CMap& cmap) {
926 928
        Parent::operator=(cmap);
927 929
        return *this;
928 930
      }
929 931
    };
930 932

	
931 933
  };
932 934

	
933 935

	
934 936
  /// \ingroup graphs
935 937
  ///
936 938
  /// \brief Digraph using a node set of another digraph or graph and
937 939
  /// an own arc set.
938 940
  ///
939 941
  /// This structure can be used to establish another directed graph
940 942
  /// over a node set of an existing one. This class uses the same
941 943
  /// Node type as the underlying graph, and each valid node of the
942 944
  /// original graph is valid in this arc set, therefore the node
943 945
  /// objects of the original graph can be used directly with this
944 946
  /// class. The node handling functions (id handling, observing, and
945 947
  /// iterators) works equivalently as in the original graph.
946 948
  ///
947 949
  /// \param GR The type of the graph which shares its node set with
948 950
  /// this class. Its interface must conform to the
949 951
  /// \ref concepts::Digraph "Digraph" or \ref concepts::Graph "Graph"
950 952
  /// concept.
951 953
  ///
952 954
  /// This implementation is slightly faster than the \c ListArcSet,
953 955
  /// because it uses continuous storage for arcs and it uses just
954 956
  /// single-linked lists for enumerate outgoing and incoming
955 957
  /// arcs. Therefore the arcs cannot be erased from the arc sets.
956 958
  ///
959
  /// This class fully conforms to the \ref concepts::Digraph "Digraph"
960
  /// concept.
961
  /// It provides only linear time counting for nodes and arcs.
962
  ///
957 963
  /// \warning If a node is erased from the underlying graph and this
958 964
  /// node is the source or target of one arc in the arc set, then
959 965
  /// the arc set is invalidated, and it cannot be used anymore. The
960 966
  /// validity can be checked with the \c valid() member function.
961
  ///
962
  /// This class fully conforms to the \ref concepts::Digraph
963
  /// "Digraph" concept.
964 967
  template <typename GR>
965 968
  class SmartArcSet : public ArcSetExtender<SmartArcSetBase<GR> > {
966 969
    typedef ArcSetExtender<SmartArcSetBase<GR> > Parent;
967 970

	
968 971
  public:
969 972

	
970 973
    typedef typename Parent::Node Node;
971 974
    typedef typename Parent::Arc Arc;
972 975

	
973 976
  protected:
974 977

	
975 978
    typedef typename Parent::NodesImplBase NodesImplBase;
976 979

	
977 980
    void eraseNode(const Node& node) {
978 981
      if (typename Parent::InArcIt(*this, node) == INVALID &&
979 982
          typename Parent::OutArcIt(*this, node) == INVALID) {
980 983
        return;
981 984
      }
982 985
      throw typename NodesImplBase::Notifier::ImmediateDetach();
983 986
    }
984 987

	
985 988
    void clearNodes() {
986 989
      Parent::clear();
987 990
    }
988 991

	
989 992
    class NodesImpl : public NodesImplBase {
990 993
      typedef NodesImplBase Parent;
991 994

	
992 995
    public:
993 996
      NodesImpl(const GR& graph, SmartArcSet& arcset)
994 997
        : Parent(graph), _arcset(arcset) {}
995 998

	
996 999
      virtual ~NodesImpl() {}
997 1000

	
998 1001
      bool attached() const {
999 1002
        return Parent::attached();
1000 1003
      }
1001 1004

	
1002 1005
    protected:
1003 1006

	
1004 1007
      virtual void erase(const Node& node) {
1005 1008
        try {
1006 1009
          _arcset.eraseNode(node);
1007 1010
          Parent::erase(node);
1008 1011
        } catch (const typename NodesImplBase::Notifier::ImmediateDetach&) {
1009 1012
          Parent::clear();
1010 1013
          throw;
1011 1014
        }
1012 1015
      }
1013 1016
      virtual void erase(const std::vector<Node>& nodes) {
1014 1017
        try {
1015 1018
          for (int i = 0; i < int(nodes.size()); ++i) {
1016 1019
            _arcset.eraseNode(nodes[i]);
1017 1020
          }
1018 1021
          Parent::erase(nodes);
1019 1022
        } catch (const typename NodesImplBase::Notifier::ImmediateDetach&) {
1020 1023
          Parent::clear();
1021 1024
          throw;
1022 1025
        }
1023 1026
      }
1024 1027
      virtual void clear() {
1025 1028
        _arcset.clearNodes();
1026 1029
        Parent::clear();
1027 1030
      }
1028 1031

	
1029 1032
    private:
1030 1033
      SmartArcSet& _arcset;
1031 1034
    };
1032 1035

	
1033 1036
    NodesImpl _nodes;
1034 1037

	
1035 1038
  public:
1036 1039

	
1037 1040
    /// \brief Constructor of the ArcSet.
1038 1041
    ///
1039 1042
    /// Constructor of the ArcSet.
1040 1043
    SmartArcSet(const GR& graph) : _nodes(graph, *this) {
1041 1044
      Parent::initalize(graph, _nodes);
1042 1045
    }
1043 1046

	
1044 1047
    /// \brief Add a new arc to the digraph.
1045 1048
    ///
1046 1049
    /// Add a new arc to the digraph with source node \c s
1047 1050
    /// and target node \c t.
1048 1051
    /// \return The new arc.
1049 1052
    Arc addArc(const Node& s, const Node& t) {
1050 1053
      return Parent::addArc(s, t);
1051 1054
    }
1052 1055

	
1053 1056
    /// \brief Validity check
1054 1057
    ///
1055 1058
    /// This functions gives back false if the ArcSet is
1056 1059
    /// invalidated. It occurs when a node in the underlying graph is
1057 1060
    /// erased and it is not isolated in the ArcSet.
1058 1061
    bool valid() const {
1059 1062
      return _nodes.attached();
1060 1063
    }
1061 1064

	
1062 1065
  };
1063 1066

	
1064 1067

	
1065 1068
  template <typename GR>
1066 1069
  class SmartEdgeSetBase {
1067 1070
  public:
1068 1071

	
1069 1072
    typedef typename GR::Node Node;
1070 1073
    typedef typename GR::NodeIt NodeIt;
1071 1074

	
1072 1075
  protected:
1073 1076

	
1074 1077
    struct NodeT {
1075 1078
      int first_out;
1076 1079
      NodeT() : first_out(-1) {}
1077 1080
    };
1078 1081

	
1079 1082
    typedef typename ItemSetTraits<GR, Node>::
1080 1083
    template Map<NodeT>::Type NodesImplBase;
1081 1084

	
1082 1085
    NodesImplBase* _nodes;
1083 1086

	
1084 1087
    struct ArcT {
1085 1088
      Node target;
1086 1089
      int next_out;
1087 1090
      ArcT() {}
1088 1091
    };
1089 1092

	
1090 1093
    std::vector<ArcT> arcs;
1091 1094

	
1092 1095
    const GR* _graph;
1093 1096

	
1094 1097
    void initalize(const GR& graph, NodesImplBase& nodes) {
1095 1098
      _graph = &graph;
1096 1099
      _nodes = &nodes;
1097 1100
    }
1098 1101

	
1099 1102
  public:
1100 1103

	
1101 1104
    class Edge {
1102 1105
      friend class SmartEdgeSetBase;
1103 1106
    protected:
1104 1107

	
1105 1108
      int id;
1106 1109
      explicit Edge(int _id) { id = _id;}
1107 1110

	
1108 1111
    public:
1109 1112
      Edge() {}
1110 1113
      Edge (Invalid) { id = -1; }
1111 1114
      bool operator==(const Edge& arc) const {return id == arc.id;}
1112 1115
      bool operator!=(const Edge& arc) const {return id != arc.id;}
1113 1116
      bool operator<(const Edge& arc) const {return id < arc.id;}
1114 1117
    };
1115 1118

	
1116 1119
    class Arc {
1117 1120
      friend class SmartEdgeSetBase;
1118 1121
    protected:
1119 1122
      Arc(int _id) : id(_id) {}
1120 1123
      int id;
1121 1124
    public:
1122 1125
      operator Edge() const { return edgeFromId(id / 2); }
1123 1126

	
1124 1127
      Arc() {}
1125 1128
      Arc(Invalid) : id(-1) {}
1126 1129
      bool operator==(const Arc& arc) const { return id == arc.id; }
1127 1130
      bool operator!=(const Arc& arc) const { return id != arc.id; }
1128 1131
      bool operator<(const Arc& arc) const { return id < arc.id; }
1129 1132
    };
1130 1133

	
1131 1134
    SmartEdgeSetBase() {}
1132 1135

	
1133 1136
    Node addNode() {
1134 1137
      LEMON_ASSERT(false,
1135 1138
        "This graph structure does not support node insertion");
1136 1139
      return INVALID; // avoid warning
1137 1140
    }
1138 1141

	
1139 1142
    Edge addEdge(const Node& u, const Node& v) {
1140 1143
      int n = arcs.size();
1141 1144
      arcs.push_back(ArcT());
1142 1145
      arcs.push_back(ArcT());
1143 1146

	
1144 1147
      arcs[n].target = u;
1145 1148
      arcs[n | 1].target = v;
1146 1149

	
1147 1150
      arcs[n].next_out = (*_nodes)[v].first_out;
1148 1151
      (*_nodes)[v].first_out = n;
1149 1152

	
1150 1153
      arcs[n | 1].next_out = (*_nodes)[u].first_out;
1151 1154
      (*_nodes)[u].first_out = (n | 1);
1152 1155

	
1153 1156
      return Edge(n / 2);
1154 1157
    }
1155 1158

	
1156 1159
    void clear() {
1157 1160
      Node node;
1158 1161
      for (first(node); node != INVALID; next(node)) {
1159 1162
        (*_nodes)[node].first_out = -1;
1160 1163
      }
1161 1164
      arcs.clear();
1162 1165
    }
1163 1166

	
1164 1167
    void first(Node& node) const {
1165 1168
      _graph->first(node);
1166 1169
    }
1167 1170

	
1168 1171
    void next(Node& node) const {
1169 1172
      _graph->next(node);
1170 1173
    }
1171 1174

	
1172 1175
    void first(Arc& arc) const {
1173 1176
      arc.id = arcs.size() - 1;
1174 1177
    }
1175 1178

	
1176 1179
    static void next(Arc& arc) {
1177 1180
      --arc.id;
1178 1181
    }
1179 1182

	
1180 1183
    void first(Edge& arc) const {
1181 1184
      arc.id = arcs.size() / 2 - 1;
1182 1185
    }
1183 1186

	
1184 1187
    static void next(Edge& arc) {
1185 1188
      --arc.id;
1186 1189
    }
1187 1190

	
1188 1191
    void firstOut(Arc& arc, const Node& node) const {
1189 1192
      arc.id = (*_nodes)[node].first_out;
1190 1193
    }
1191 1194

	
1192 1195
    void nextOut(Arc& arc) const {
1193 1196
      arc.id = arcs[arc.id].next_out;
1194 1197
    }
1195 1198

	
1196 1199
    void firstIn(Arc& arc, const Node& node) const {
1197 1200
      arc.id = (((*_nodes)[node].first_out) ^ 1);
1198 1201
      if (arc.id == -2) arc.id = -1;
1199 1202
    }
1200 1203

	
1201 1204
    void nextIn(Arc& arc) const {
1202 1205
      arc.id = ((arcs[arc.id ^ 1].next_out) ^ 1);
1203 1206
      if (arc.id == -2) arc.id = -1;
1204 1207
    }
1205 1208

	
1206 1209
    void firstInc(Edge &arc, bool& dir, const Node& node) const {
1207 1210
      int de = (*_nodes)[node].first_out;
1208 1211
      if (de != -1 ) {
1209 1212
        arc.id = de / 2;
1210 1213
        dir = ((de & 1) == 1);
1211 1214
      } else {
1212 1215
        arc.id = -1;
1213 1216
        dir = true;
1214 1217
      }
1215 1218
    }
1216 1219
    void nextInc(Edge &arc, bool& dir) const {
1217 1220
      int de = (arcs[(arc.id * 2) | (dir ? 1 : 0)].next_out);
1218 1221
      if (de != -1 ) {
1219 1222
        arc.id = de / 2;
1220 1223
        dir = ((de & 1) == 1);
1221 1224
      } else {
1222 1225
        arc.id = -1;
1223 1226
        dir = true;
1224 1227
      }
1225 1228
    }
1226 1229

	
1227 1230
    static bool direction(Arc arc) {
1228 1231
      return (arc.id & 1) == 1;
1229 1232
    }
1230 1233

	
1231 1234
    static Arc direct(Edge edge, bool dir) {
1232 1235
      return Arc(edge.id * 2 + (dir ? 1 : 0));
1233 1236
    }
1234 1237

	
1235 1238
    int id(Node node) const { return _graph->id(node); }
1236 1239
    static int id(Arc arc) { return arc.id; }
1237 1240
    static int id(Edge arc) { return arc.id; }
1238 1241

	
1239 1242
    Node nodeFromId(int id) const { return _graph->nodeFromId(id); }
1240 1243
    static Arc arcFromId(int id) { return Arc(id); }
1241 1244
    static Edge edgeFromId(int id) { return Edge(id);}
1242 1245

	
1243 1246
    int maxNodeId() const { return _graph->maxNodeId(); };
1244 1247
    int maxArcId() const { return arcs.size() - 1; }
1245 1248
    int maxEdgeId() const { return arcs.size() / 2 - 1; }
1246 1249

	
1247 1250
    Node source(Arc e) const { return arcs[e.id ^ 1].target; }
1248 1251
    Node target(Arc e) const { return arcs[e.id].target; }
1249 1252

	
1250 1253
    Node u(Edge e) const { return arcs[2 * e.id].target; }
1251 1254
    Node v(Edge e) const { return arcs[2 * e.id + 1].target; }
1252 1255

	
1253 1256
    typedef typename ItemSetTraits<GR, Node>::ItemNotifier NodeNotifier;
1254 1257

	
1255 1258
    NodeNotifier& notifier(Node) const {
1256 1259
      return _graph->notifier(Node());
1257 1260
    }
1258 1261

	
1259 1262
    template <typename V>
1260 1263
    class NodeMap : public GR::template NodeMap<V> {
1261 1264
      typedef typename GR::template NodeMap<V> Parent;
1262 1265

	
1263 1266
    public:
1264 1267

	
1265 1268
      explicit NodeMap(const SmartEdgeSetBase<GR>& arcset)
1266 1269
        : Parent(*arcset._graph) { }
1267 1270

	
1268 1271
      NodeMap(const SmartEdgeSetBase<GR>& arcset, const V& value)
1269 1272
        : Parent(*arcset._graph, value) { }
1270 1273

	
1271 1274
      NodeMap& operator=(const NodeMap& cmap) {
1272 1275
        return operator=<NodeMap>(cmap);
1273 1276
      }
1274 1277

	
1275 1278
      template <typename CMap>
1276 1279
      NodeMap& operator=(const CMap& cmap) {
1277 1280
        Parent::operator=(cmap);
1278 1281
        return *this;
1279 1282
      }
1280 1283
    };
1281 1284

	
1282 1285
  };
1283 1286

	
1284 1287
  /// \ingroup graphs
1285 1288
  ///
1286 1289
  /// \brief Graph using a node set of another digraph or graph and an
1287 1290
  /// own edge set.
1288 1291
  ///
1289 1292
  /// This structure can be used to establish another graph over a
1290 1293
  /// node set of an existing one. This class uses the same Node type
1291 1294
  /// as the underlying graph, and each valid node of the original
1292 1295
  /// graph is valid in this arc set, therefore the node objects of
1293 1296
  /// the original graph can be used directly with this class. The
1294 1297
  /// node handling functions (id handling, observing, and iterators)
1295 1298
  /// works equivalently as in the original graph.
1296 1299
  ///
1297 1300
  /// \param GR The type of the graph which shares its node set
1298 1301
  /// with this class. Its interface must conform to the
1299 1302
  /// \ref concepts::Digraph "Digraph" or \ref concepts::Graph "Graph"
1300 1303
  ///  concept.
1301 1304
  ///
1302 1305
  /// This implementation is slightly faster than the \c ListEdgeSet,
1303 1306
  /// because it uses continuous storage for edges and it uses just
1304 1307
  /// single-linked lists for enumerate incident edges. Therefore the
1305 1308
  /// edges cannot be erased from the edge sets.
1306 1309
  ///
1310
  /// This class fully conforms to the \ref concepts::Graph "Graph"
1311
  /// concept.
1312
  /// It provides only linear time counting for nodes, edges and arcs.
1313
  ///
1307 1314
  /// \warning If a node is erased from the underlying graph and this
1308 1315
  /// node is incident to one edge in the edge set, then the edge set
1309 1316
  /// is invalidated, and it cannot be used anymore. The validity can
1310 1317
  /// be checked with the \c valid() member function.
1311
  ///
1312
  /// This class fully conforms to the \ref concepts::Graph
1313
  /// "Graph" concept.
1314 1318
  template <typename GR>
1315 1319
  class SmartEdgeSet : public EdgeSetExtender<SmartEdgeSetBase<GR> > {
1316 1320
    typedef EdgeSetExtender<SmartEdgeSetBase<GR> > Parent;
1317 1321

	
1318 1322
  public:
1319 1323

	
1320 1324
    typedef typename Parent::Node Node;
1321 1325
    typedef typename Parent::Arc Arc;
1322 1326
    typedef typename Parent::Edge Edge;
1323 1327

	
1324 1328
  protected:
1325 1329

	
1326 1330
    typedef typename Parent::NodesImplBase NodesImplBase;
1327 1331

	
1328 1332
    void eraseNode(const Node& node) {
1329 1333
      if (typename Parent::IncEdgeIt(*this, node) == INVALID) {
1330 1334
        return;
1331 1335
      }
1332 1336
      throw typename NodesImplBase::Notifier::ImmediateDetach();
1333 1337
    }
1334 1338

	
1335 1339
    void clearNodes() {
1336 1340
      Parent::clear();
1337 1341
    }
1338 1342

	
1339 1343
    class NodesImpl : public NodesImplBase {
1340 1344
      typedef NodesImplBase Parent;
1341 1345

	
1342 1346
    public:
1343 1347
      NodesImpl(const GR& graph, SmartEdgeSet& arcset)
1344 1348
        : Parent(graph), _arcset(arcset) {}
1345 1349

	
1346 1350
      virtual ~NodesImpl() {}
1347 1351

	
1348 1352
      bool attached() const {
1349 1353
        return Parent::attached();
1350 1354
      }
1351 1355

	
1352 1356
    protected:
1353 1357

	
1354 1358
      virtual void erase(const Node& node) {
1355 1359
        try {
1356 1360
          _arcset.eraseNode(node);
1357 1361
          Parent::erase(node);
1358 1362
        } catch (const typename NodesImplBase::Notifier::ImmediateDetach&) {
1359 1363
          Parent::clear();
1360 1364
          throw;
1361 1365
        }
1362 1366
      }
1363 1367
      virtual void erase(const std::vector<Node>& nodes) {
1364 1368
        try {
1365 1369
          for (int i = 0; i < int(nodes.size()); ++i) {
1366 1370
            _arcset.eraseNode(nodes[i]);
1367 1371
          }
1368 1372
          Parent::erase(nodes);
1369 1373
        } catch (const typename NodesImplBase::Notifier::ImmediateDetach&) {
1370 1374
          Parent::clear();
1371 1375
          throw;
1372 1376
        }
1373 1377
      }
1374 1378
      virtual void clear() {
1375 1379
        _arcset.clearNodes();
1376 1380
        Parent::clear();
1377 1381
      }
1378 1382

	
1379 1383
    private:
1380 1384
      SmartEdgeSet& _arcset;
1381 1385
    };
1382 1386

	
1383 1387
    NodesImpl _nodes;
1384 1388

	
1385 1389
  public:
1386 1390

	
1387 1391
    /// \brief Constructor of the EdgeSet.
1388 1392
    ///
1389 1393
    /// Constructor of the EdgeSet.
1390 1394
    SmartEdgeSet(const GR& graph) : _nodes(graph, *this) {
1391 1395
      Parent::initalize(graph, _nodes);
1392 1396
    }
1393 1397

	
1394 1398
    /// \brief Add a new edge to the graph.
1395 1399
    ///
1396 1400
    /// Add a new edge to the graph with node \c u
1397 1401
    /// and node \c v endpoints.
1398 1402
    /// \return The new edge.
1399 1403
    Edge addEdge(const Node& u, const Node& v) {
1400 1404
      return Parent::addEdge(u, v);
1401 1405
    }
1402 1406

	
1403 1407
    /// \brief Validity check
1404 1408
    ///
1405 1409
    /// This functions gives back false if the EdgeSet is
1406 1410
    /// invalidated. It occurs when a node in the underlying graph is
1407 1411
    /// erased and it is not isolated in the EdgeSet.
1408 1412
    bool valid() const {
1409 1413
      return _nodes.attached();
1410 1414
    }
1411 1415

	
1412 1416
  };
1413 1417

	
1414 1418
}
1415 1419

	
1416 1420
#endif
Show white space 384 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_FULL_GRAPH_H
20 20
#define LEMON_FULL_GRAPH_H
21 21

	
22 22
#include <lemon/core.h>
23 23
#include <lemon/bits/graph_extender.h>
24 24

	
25 25
///\ingroup graphs
26 26
///\file
27 27
///\brief FullDigraph and FullGraph classes.
28 28

	
29 29
namespace lemon {
30 30

	
31 31
  class FullDigraphBase {
32 32
  public:
33 33

	
34 34
    typedef FullDigraphBase Digraph;
35 35

	
36 36
    class Node;
37 37
    class Arc;
38 38

	
39 39
  protected:
40 40

	
41 41
    int _node_num;
42 42
    int _arc_num;
43 43

	
44 44
    FullDigraphBase() {}
45 45

	
46 46
    void construct(int n) { _node_num = n; _arc_num = n * n; }
47 47

	
48 48
  public:
49 49

	
50 50
    typedef True NodeNumTag;
51 51
    typedef True ArcNumTag;
52 52

	
53 53
    Node operator()(int ix) const { return Node(ix); }
54 54
    static int index(const Node& node) { return node._id; }
55 55

	
56 56
    Arc arc(const Node& s, const Node& t) const {
57 57
      return Arc(s._id * _node_num + t._id);
58 58
    }
59 59

	
60 60
    int nodeNum() const { return _node_num; }
61 61
    int arcNum() const { return _arc_num; }
62 62

	
63 63
    int maxNodeId() const { return _node_num - 1; }
64 64
    int maxArcId() const { return _arc_num - 1; }
65 65

	
66 66
    Node source(Arc arc) const { return arc._id / _node_num; }
67 67
    Node target(Arc arc) const { return arc._id % _node_num; }
68 68

	
69 69
    static int id(Node node) { return node._id; }
70 70
    static int id(Arc arc) { return arc._id; }
71 71

	
72 72
    static Node nodeFromId(int id) { return Node(id);}
73 73
    static Arc arcFromId(int id) { return Arc(id);}
74 74

	
75 75
    typedef True FindArcTag;
76 76

	
77 77
    Arc findArc(Node s, Node t, Arc prev = INVALID) const {
78 78
      return prev == INVALID ? arc(s, t) : INVALID;
79 79
    }
80 80

	
81 81
    class Node {
82 82
      friend class FullDigraphBase;
83 83

	
84 84
    protected:
85 85
      int _id;
86 86
      Node(int id) : _id(id) {}
87 87
    public:
88 88
      Node() {}
89 89
      Node (Invalid) : _id(-1) {}
90 90
      bool operator==(const Node node) const {return _id == node._id;}
91 91
      bool operator!=(const Node node) const {return _id != node._id;}
92 92
      bool operator<(const Node node) const {return _id < node._id;}
93 93
    };
94 94

	
95 95
    class Arc {
96 96
      friend class FullDigraphBase;
97 97

	
98 98
    protected:
99 99
      int _id;  // _node_num * source + target;
100 100

	
101 101
      Arc(int id) : _id(id) {}
102 102

	
103 103
    public:
104 104
      Arc() { }
105 105
      Arc (Invalid) { _id = -1; }
106 106
      bool operator==(const Arc arc) const {return _id == arc._id;}
107 107
      bool operator!=(const Arc arc) const {return _id != arc._id;}
108 108
      bool operator<(const Arc arc) const {return _id < arc._id;}
109 109
    };
110 110

	
111 111
    void first(Node& node) const {
112 112
      node._id = _node_num - 1;
113 113
    }
114 114

	
115 115
    static void next(Node& node) {
116 116
      --node._id;
117 117
    }
118 118

	
119 119
    void first(Arc& arc) const {
120 120
      arc._id = _arc_num - 1;
121 121
    }
122 122

	
123 123
    static void next(Arc& arc) {
124 124
      --arc._id;
125 125
    }
126 126

	
127 127
    void firstOut(Arc& arc, const Node& node) const {
128 128
      arc._id = (node._id + 1) * _node_num - 1;
129 129
    }
130 130

	
131 131
    void nextOut(Arc& arc) const {
132 132
      if (arc._id % _node_num == 0) arc._id = 0;
133 133
      --arc._id;
134 134
    }
135 135

	
136 136
    void firstIn(Arc& arc, const Node& node) const {
137 137
      arc._id = _arc_num + node._id - _node_num;
138 138
    }
139 139

	
140 140
    void nextIn(Arc& arc) const {
141 141
      arc._id -= _node_num;
142 142
      if (arc._id < 0) arc._id = -1;
143 143
    }
144 144

	
145 145
  };
146 146

	
147 147
  typedef DigraphExtender<FullDigraphBase> ExtendedFullDigraphBase;
148 148

	
149 149
  /// \ingroup graphs
150 150
  ///
151 151
  /// \brief A directed full graph class.
152 152
  ///
153 153
  /// FullDigraph is a simple and fast implmenetation of directed full
154 154
  /// (complete) graphs. It contains an arc from each node to each node
155 155
  /// (including a loop for each node), therefore the number of arcs
156 156
  /// is the square of the number of nodes.
157 157
  /// This class is completely static and it needs constant memory space.
158 158
  /// Thus you can neither add nor delete nodes or arcs, however
159 159
  /// the structure can be resized using resize().
160 160
  ///
161 161
  /// This type fully conforms to the \ref concepts::Digraph "Digraph concept".
162 162
  /// Most of its member functions and nested classes are documented
163 163
  /// only in the concept class.
164 164
  ///
165
  /// This class provides constant time counting for nodes and arcs.
166
  ///
165 167
  /// \note FullDigraph and FullGraph classes are very similar,
166 168
  /// but there are two differences. While this class conforms only
167 169
  /// to the \ref concepts::Digraph "Digraph" concept, FullGraph
168 170
  /// conforms to the \ref concepts::Graph "Graph" concept,
169 171
  /// moreover FullGraph does not contain a loop for each
170 172
  /// node as this class does.
171 173
  ///
172 174
  /// \sa FullGraph
173 175
  class FullDigraph : public ExtendedFullDigraphBase {
174 176
    typedef ExtendedFullDigraphBase Parent;
175 177

	
176 178
  public:
177 179

	
178 180
    /// \brief Default constructor.
179 181
    ///
180 182
    /// Default constructor. The number of nodes and arcs will be zero.
181 183
    FullDigraph() { construct(0); }
182 184

	
183 185
    /// \brief Constructor
184 186
    ///
185 187
    /// Constructor.
186 188
    /// \param n The number of the nodes.
187 189
    FullDigraph(int n) { construct(n); }
188 190

	
189 191
    /// \brief Resizes the digraph
190 192
    ///
191 193
    /// This function resizes the digraph. It fully destroys and
192 194
    /// rebuilds the structure, therefore the maps of the digraph will be
193 195
    /// reallocated automatically and the previous values will be lost.
194 196
    void resize(int n) {
195 197
      Parent::notifier(Arc()).clear();
196 198
      Parent::notifier(Node()).clear();
197 199
      construct(n);
198 200
      Parent::notifier(Node()).build();
199 201
      Parent::notifier(Arc()).build();
200 202
    }
201 203

	
202 204
    /// \brief Returns the node with the given index.
203 205
    ///
204 206
    /// Returns the node with the given index. Since this structure is 
205 207
    /// completely static, the nodes can be indexed with integers from
206 208
    /// the range <tt>[0..nodeNum()-1]</tt>.
209
    /// The index of a node is the same as its ID.
207 210
    /// \sa index()
208 211
    Node operator()(int ix) const { return Parent::operator()(ix); }
209 212

	
210 213
    /// \brief Returns the index of the given node.
211 214
    ///
212 215
    /// Returns the index of the given node. Since this structure is 
213 216
    /// completely static, the nodes can be indexed with integers from
214 217
    /// the range <tt>[0..nodeNum()-1]</tt>.
218
    /// The index of a node is the same as its ID.
215 219
    /// \sa operator()()
216 220
    static int index(const Node& node) { return Parent::index(node); }
217 221

	
218 222
    /// \brief Returns the arc connecting the given nodes.
219 223
    ///
220 224
    /// Returns the arc connecting the given nodes.
221 225
    Arc arc(Node u, Node v) const {
222 226
      return Parent::arc(u, v);
223 227
    }
224 228

	
225 229
    /// \brief Number of nodes.
226 230
    int nodeNum() const { return Parent::nodeNum(); }
227 231
    /// \brief Number of arcs.
228 232
    int arcNum() const { return Parent::arcNum(); }
229 233
  };
230 234

	
231 235

	
232 236
  class FullGraphBase {
233 237
  public:
234 238

	
235 239
    typedef FullGraphBase Graph;
236 240

	
237 241
    class Node;
238 242
    class Arc;
239 243
    class Edge;
240 244

	
241 245
  protected:
242 246

	
243 247
    int _node_num;
244 248
    int _edge_num;
245 249

	
246 250
    FullGraphBase() {}
247 251

	
248 252
    void construct(int n) { _node_num = n; _edge_num = n * (n - 1) / 2; }
249 253

	
250 254
    int _uid(int e) const {
251 255
      int u = e / _node_num;
252 256
      int v = e % _node_num;
253 257
      return u < v ? u : _node_num - 2 - u;
254 258
    }
255 259

	
256 260
    int _vid(int e) const {
257 261
      int u = e / _node_num;
258 262
      int v = e % _node_num;
259 263
      return u < v ? v : _node_num - 1 - v;
260 264
    }
261 265

	
262 266
    void _uvid(int e, int& u, int& v) const {
263 267
      u = e / _node_num;
264 268
      v = e % _node_num;
265 269
      if  (u >= v) {
266 270
        u = _node_num - 2 - u;
267 271
        v = _node_num - 1 - v;
268 272
      }
269 273
    }
270 274

	
271 275
    void _stid(int a, int& s, int& t) const {
272 276
      if ((a & 1) == 1) {
273 277
        _uvid(a >> 1, s, t);
274 278
      } else {
275 279
        _uvid(a >> 1, t, s);
276 280
      }
277 281
    }
278 282

	
279 283
    int _eid(int u, int v) const {
280 284
      if (u < (_node_num - 1) / 2) {
281 285
        return u * _node_num + v;
282 286
      } else {
283 287
        return (_node_num - 1 - u) * _node_num - v - 1;
284 288
      }
285 289
    }
286 290

	
287 291
  public:
288 292

	
289 293
    Node operator()(int ix) const { return Node(ix); }
290 294
    static int index(const Node& node) { return node._id; }
291 295

	
292 296
    Edge edge(const Node& u, const Node& v) const {
293 297
      if (u._id < v._id) {
294 298
        return Edge(_eid(u._id, v._id));
295 299
      } else if (u._id != v._id) {
296 300
        return Edge(_eid(v._id, u._id));
297 301
      } else {
298 302
        return INVALID;
299 303
      }
300 304
    }
301 305

	
302 306
    Arc arc(const Node& s, const Node& t) const {
303 307
      if (s._id < t._id) {
304 308
        return Arc((_eid(s._id, t._id) << 1) | 1);
305 309
      } else if (s._id != t._id) {
306 310
        return Arc(_eid(t._id, s._id) << 1);
307 311
      } else {
308 312
        return INVALID;
309 313
      }
310 314
    }
311 315

	
312 316
    typedef True NodeNumTag;
313 317
    typedef True ArcNumTag;
314 318
    typedef True EdgeNumTag;
315 319

	
316 320
    int nodeNum() const { return _node_num; }
317 321
    int arcNum() const { return 2 * _edge_num; }
318 322
    int edgeNum() const { return _edge_num; }
319 323

	
320 324
    static int id(Node node) { return node._id; }
321 325
    static int id(Arc arc) { return arc._id; }
322 326
    static int id(Edge edge) { return edge._id; }
323 327

	
324 328
    int maxNodeId() const { return _node_num-1; }
325 329
    int maxArcId() const { return 2 * _edge_num-1; }
326 330
    int maxEdgeId() const { return _edge_num-1; }
327 331

	
328 332
    static Node nodeFromId(int id) { return Node(id);}
329 333
    static Arc arcFromId(int id) { return Arc(id);}
330 334
    static Edge edgeFromId(int id) { return Edge(id);}
331 335

	
332 336
    Node u(Edge edge) const {
333 337
      return Node(_uid(edge._id));
334 338
    }
335 339

	
336 340
    Node v(Edge edge) const {
337 341
      return Node(_vid(edge._id));
338 342
    }
339 343

	
340 344
    Node source(Arc arc) const {
341 345
      return Node((arc._id & 1) == 1 ?
342 346
                  _uid(arc._id >> 1) : _vid(arc._id >> 1));
343 347
    }
344 348

	
345 349
    Node target(Arc arc) const {
346 350
      return Node((arc._id & 1) == 1 ?
347 351
                  _vid(arc._id >> 1) : _uid(arc._id >> 1));
348 352
    }
349 353

	
350 354
    typedef True FindEdgeTag;
351 355
    typedef True FindArcTag;
352 356

	
353 357
    Edge findEdge(Node u, Node v, Edge prev = INVALID) const {
354 358
      return prev != INVALID ? INVALID : edge(u, v);
355 359
    }
356 360

	
357 361
    Arc findArc(Node s, Node t, Arc prev = INVALID) const {
358 362
      return prev != INVALID ? INVALID : arc(s, t);
359 363
    }
360 364

	
361 365
    class Node {
362 366
      friend class FullGraphBase;
363 367

	
364 368
    protected:
365 369
      int _id;
366 370
      Node(int id) : _id(id) {}
367 371
    public:
368 372
      Node() {}
369 373
      Node (Invalid) { _id = -1; }
370 374
      bool operator==(const Node node) const {return _id == node._id;}
371 375
      bool operator!=(const Node node) const {return _id != node._id;}
372 376
      bool operator<(const Node node) const {return _id < node._id;}
373 377
    };
374 378

	
375 379
    class Edge {
376 380
      friend class FullGraphBase;
377 381
      friend class Arc;
378 382

	
379 383
    protected:
380 384
      int _id;
381 385

	
382 386
      Edge(int id) : _id(id) {}
383 387

	
384 388
    public:
385 389
      Edge() { }
386 390
      Edge (Invalid) { _id = -1; }
387 391

	
388 392
      bool operator==(const Edge edge) const {return _id == edge._id;}
389 393
      bool operator!=(const Edge edge) const {return _id != edge._id;}
390 394
      bool operator<(const Edge edge) const {return _id < edge._id;}
391 395
    };
392 396

	
393 397
    class Arc {
394 398
      friend class FullGraphBase;
395 399

	
396 400
    protected:
397 401
      int _id;
398 402

	
399 403
      Arc(int id) : _id(id) {}
400 404

	
401 405
    public:
402 406
      Arc() { }
403 407
      Arc (Invalid) { _id = -1; }
404 408

	
405 409
      operator Edge() const { return Edge(_id != -1 ? (_id >> 1) : -1); }
406 410

	
407 411
      bool operator==(const Arc arc) const {return _id == arc._id;}
408 412
      bool operator!=(const Arc arc) const {return _id != arc._id;}
409 413
      bool operator<(const Arc arc) const {return _id < arc._id;}
410 414
    };
411 415

	
412 416
    static bool direction(Arc arc) {
413 417
      return (arc._id & 1) == 1;
414 418
    }
415 419

	
416 420
    static Arc direct(Edge edge, bool dir) {
417 421
      return Arc((edge._id << 1) | (dir ? 1 : 0));
418 422
    }
419 423

	
420 424
    void first(Node& node) const {
421 425
      node._id = _node_num - 1;
422 426
    }
423 427

	
424 428
    static void next(Node& node) {
425 429
      --node._id;
426 430
    }
427 431

	
428 432
    void first(Arc& arc) const {
429 433
      arc._id = (_edge_num << 1) - 1;
430 434
    }
431 435

	
432 436
    static void next(Arc& arc) {
433 437
      --arc._id;
434 438
    }
435 439

	
436 440
    void first(Edge& edge) const {
437 441
      edge._id = _edge_num - 1;
438 442
    }
439 443

	
440 444
    static void next(Edge& edge) {
441 445
      --edge._id;
442 446
    }
443 447

	
444 448
    void firstOut(Arc& arc, const Node& node) const {
445 449
      int s = node._id, t = _node_num - 1;
446 450
      if (s < t) {
447 451
        arc._id = (_eid(s, t) << 1) | 1;
448 452
      } else {
449 453
        --t;
450 454
        arc._id = (t != -1 ? (_eid(t, s) << 1) : -1);
451 455
      }
452 456
    }
453 457

	
454 458
    void nextOut(Arc& arc) const {
455 459
      int s, t;
456 460
      _stid(arc._id, s, t);
457 461
      --t;
458 462
      if (s < t) {
459 463
        arc._id = (_eid(s, t) << 1) | 1;
460 464
      } else {
461 465
        if (s == t) --t;
462 466
        arc._id = (t != -1 ? (_eid(t, s) << 1) : -1);
463 467
      }
464 468
    }
465 469

	
466 470
    void firstIn(Arc& arc, const Node& node) const {
467 471
      int s = _node_num - 1, t = node._id;
468 472
      if (s > t) {
469 473
        arc._id = (_eid(t, s) << 1);
470 474
      } else {
471 475
        --s;
472 476
        arc._id = (s != -1 ? (_eid(s, t) << 1) | 1 : -1);
473 477
      }
474 478
    }
475 479

	
476 480
    void nextIn(Arc& arc) const {
477 481
      int s, t;
478 482
      _stid(arc._id, s, t);
479 483
      --s;
480 484
      if (s > t) {
481 485
        arc._id = (_eid(t, s) << 1);
482 486
      } else {
483 487
        if (s == t) --s;
484 488
        arc._id = (s != -1 ? (_eid(s, t) << 1) | 1 : -1);
485 489
      }
486 490
    }
487 491

	
488 492
    void firstInc(Edge& edge, bool& dir, const Node& node) const {
489 493
      int u = node._id, v = _node_num - 1;
490 494
      if (u < v) {
491 495
        edge._id = _eid(u, v);
492 496
        dir = true;
493 497
      } else {
494 498
        --v;
495 499
        edge._id = (v != -1 ? _eid(v, u) : -1);
496 500
        dir = false;
497 501
      }
498 502
    }
499 503

	
500 504
    void nextInc(Edge& edge, bool& dir) const {
501 505
      int u, v;
502 506
      if (dir) {
503 507
        _uvid(edge._id, u, v);
504 508
        --v;
505 509
        if (u < v) {
506 510
          edge._id = _eid(u, v);
507 511
        } else {
508 512
          --v;
509 513
          edge._id = (v != -1 ? _eid(v, u) : -1);
510 514
          dir = false;
511 515
        }
512 516
      } else {
513 517
        _uvid(edge._id, v, u);
514 518
        --v;
515 519
        edge._id = (v != -1 ? _eid(v, u) : -1);
516 520
      }
517 521
    }
518 522

	
519 523
  };
520 524

	
521 525
  typedef GraphExtender<FullGraphBase> ExtendedFullGraphBase;
522 526

	
523 527
  /// \ingroup graphs
524 528
  ///
525 529
  /// \brief An undirected full graph class.
526 530
  ///
527 531
  /// FullGraph is a simple and fast implmenetation of undirected full
528 532
  /// (complete) graphs. It contains an edge between every distinct pair
529 533
  /// of nodes, therefore the number of edges is <tt>n(n-1)/2</tt>.
530 534
  /// This class is completely static and it needs constant memory space.
531 535
  /// Thus you can neither add nor delete nodes or edges, however
532 536
  /// the structure can be resized using resize().
533 537
  ///
534 538
  /// This type fully conforms to the \ref concepts::Graph "Graph concept".
535 539
  /// Most of its member functions and nested classes are documented
536 540
  /// only in the concept class.
537 541
  ///
542
  /// This class provides constant time counting for nodes, edges and arcs.
543
  ///
538 544
  /// \note FullDigraph and FullGraph classes are very similar,
539 545
  /// but there are two differences. While FullDigraph
540 546
  /// conforms only to the \ref concepts::Digraph "Digraph" concept,
541 547
  /// this class conforms to the \ref concepts::Graph "Graph" concept,
542 548
  /// moreover this class does not contain a loop for each
543 549
  /// node as FullDigraph does.
544 550
  ///
545 551
  /// \sa FullDigraph
546 552
  class FullGraph : public ExtendedFullGraphBase {
547 553
    typedef ExtendedFullGraphBase Parent;
548 554

	
549 555
  public:
550 556

	
551 557
    /// \brief Default constructor.
552 558
    ///
553 559
    /// Default constructor. The number of nodes and edges will be zero.
554 560
    FullGraph() { construct(0); }
555 561

	
556 562
    /// \brief Constructor
557 563
    ///
558 564
    /// Constructor.
559 565
    /// \param n The number of the nodes.
560 566
    FullGraph(int n) { construct(n); }
561 567

	
562 568
    /// \brief Resizes the graph
563 569
    ///
564 570
    /// This function resizes the graph. It fully destroys and
565 571
    /// rebuilds the structure, therefore the maps of the graph will be
566 572
    /// reallocated automatically and the previous values will be lost.
567 573
    void resize(int n) {
568 574
      Parent::notifier(Arc()).clear();
569 575
      Parent::notifier(Edge()).clear();
570 576
      Parent::notifier(Node()).clear();
571 577
      construct(n);
572 578
      Parent::notifier(Node()).build();
573 579
      Parent::notifier(Edge()).build();
574 580
      Parent::notifier(Arc()).build();
575 581
    }
576 582

	
577 583
    /// \brief Returns the node with the given index.
578 584
    ///
579 585
    /// Returns the node with the given index. Since this structure is 
580 586
    /// completely static, the nodes can be indexed with integers from
581 587
    /// the range <tt>[0..nodeNum()-1]</tt>.
588
    /// The index of a node is the same as its ID.
582 589
    /// \sa index()
583 590
    Node operator()(int ix) const { return Parent::operator()(ix); }
584 591

	
585 592
    /// \brief Returns the index of the given node.
586 593
    ///
587 594
    /// Returns the index of the given node. Since this structure is 
588 595
    /// completely static, the nodes can be indexed with integers from
589 596
    /// the range <tt>[0..nodeNum()-1]</tt>.
597
    /// The index of a node is the same as its ID.
590 598
    /// \sa operator()()
591 599
    static int index(const Node& node) { return Parent::index(node); }
592 600

	
593 601
    /// \brief Returns the arc connecting the given nodes.
594 602
    ///
595 603
    /// Returns the arc connecting the given nodes.
596 604
    Arc arc(Node s, Node t) const {
597 605
      return Parent::arc(s, t);
598 606
    }
599 607

	
600 608
    /// \brief Returns the edge connecting the given nodes.
601 609
    ///
602 610
    /// Returns the edge connecting the given nodes.
603 611
    Edge edge(Node u, Node v) const {
604 612
      return Parent::edge(u, v);
605 613
    }
606 614

	
607 615
    /// \brief Number of nodes.
608 616
    int nodeNum() const { return Parent::nodeNum(); }
609 617
    /// \brief Number of arcs.
610 618
    int arcNum() const { return Parent::arcNum(); }
611 619
    /// \brief Number of edges.
612 620
    int edgeNum() const { return Parent::edgeNum(); }
613 621

	
614 622
  };
615 623

	
616 624

	
617 625
} //namespace lemon
618 626

	
619 627

	
620 628
#endif //LEMON_FULL_GRAPH_H
Show white space 384 line context
... ...
@@ -314,384 +314,386 @@
314 314
      if (node._id < _node_num - _width) {
315 315
        arc._id = node._id << 1;
316 316
        return;
317 317
      }
318 318
      if (node._id % _width > 0) {
319 319
        arc._id = (_edge_limit + node._id % _width +
320 320
                   (node._id / _width) * (_width - 1) - 1) << 1 | 1;
321 321
        return;
322 322
      }
323 323
      if (node._id >= _width) {
324 324
        arc._id = (node._id - _width) << 1 | 1;
325 325
        return;
326 326
      }
327 327
      arc._id = -1;
328 328
    }
329 329

	
330 330
    void nextIn(Arc& arc) const {
331 331
      int nid = arc._id >> 1;
332 332
      if ((arc._id & 1) == 0) {
333 333
        if (nid >= _edge_limit) {
334 334
          nid = (nid - _edge_limit) % (_width - 1) +
335 335
            (nid - _edge_limit) / (_width - 1) * _width;
336 336
          if (nid < _node_num - _width) {
337 337
            arc._id = nid << 1;
338 338
            return;
339 339
          }
340 340
        }
341 341
        if (nid % _width > 0) {
342 342
          arc._id = (_edge_limit + nid % _width +
343 343
                     (nid / _width) * (_width - 1) - 1) << 1 | 1;
344 344
          return;
345 345
        }
346 346
        if (nid >= _width) {
347 347
          arc._id = (nid - _width) << 1 | 1;
348 348
          return;
349 349
        }
350 350
      } else {
351 351
        if (nid >= _edge_limit) {
352 352
          nid = (nid - _edge_limit) % (_width - 1) +
353 353
            (nid - _edge_limit) / (_width - 1) * _width + 1;
354 354
          if (nid >= _width) {
355 355
            arc._id = (nid - _width) << 1 | 1;
356 356
            return;
357 357
          }
358 358
        }
359 359
      }
360 360
      arc._id = -1;
361 361
    }
362 362

	
363 363
    void firstInc(Edge& edge, bool& dir, const Node& node) const {
364 364
      if (node._id % _width < _width - 1) {
365 365
        edge._id = _edge_limit + node._id % _width +
366 366
          (node._id / _width) * (_width - 1);
367 367
        dir = true;
368 368
        return;
369 369
      }
370 370
      if (node._id < _node_num - _width) {
371 371
        edge._id = node._id;
372 372
        dir = true;
373 373
        return;
374 374
      }
375 375
      if (node._id % _width > 0) {
376 376
        edge._id = _edge_limit + node._id % _width +
377 377
          (node._id / _width) * (_width - 1) - 1;
378 378
        dir = false;
379 379
        return;
380 380
      }
381 381
      if (node._id >= _width) {
382 382
        edge._id = node._id - _width;
383 383
        dir = false;
384 384
        return;
385 385
      }
386 386
      edge._id = -1;
387 387
      dir = true;
388 388
    }
389 389

	
390 390
    void nextInc(Edge& edge, bool& dir) const {
391 391
      int nid = edge._id;
392 392
      if (dir) {
393 393
        if (nid >= _edge_limit) {
394 394
          nid = (nid - _edge_limit) % (_width - 1) +
395 395
            (nid - _edge_limit) / (_width - 1) * _width;
396 396
          if (nid < _node_num - _width) {
397 397
            edge._id = nid;
398 398
            return;
399 399
          }
400 400
        }
401 401
        if (nid % _width > 0) {
402 402
          edge._id = _edge_limit + nid % _width +
403 403
            (nid / _width) * (_width - 1) - 1;
404 404
          dir = false;
405 405
          return;
406 406
        }
407 407
        if (nid >= _width) {
408 408
          edge._id = nid - _width;
409 409
          dir = false;
410 410
          return;
411 411
        }
412 412
      } else {
413 413
        if (nid >= _edge_limit) {
414 414
          nid = (nid - _edge_limit) % (_width - 1) +
415 415
            (nid - _edge_limit) / (_width - 1) * _width + 1;
416 416
          if (nid >= _width) {
417 417
            edge._id = nid - _width;
418 418
            return;
419 419
          }
420 420
        }
421 421
      }
422 422
      edge._id = -1;
423 423
      dir = true;
424 424
    }
425 425

	
426 426
    Arc right(Node n) const {
427 427
      if (n._id % _width < _width - 1) {
428 428
        return Arc(((_edge_limit + n._id % _width +
429 429
                    (n._id / _width) * (_width - 1)) << 1) | 1);
430 430
      } else {
431 431
        return INVALID;
432 432
      }
433 433
    }
434 434

	
435 435
    Arc left(Node n) const {
436 436
      if (n._id % _width > 0) {
437 437
        return Arc((_edge_limit + n._id % _width +
438 438
                     (n._id / _width) * (_width - 1) - 1) << 1);
439 439
      } else {
440 440
        return INVALID;
441 441
      }
442 442
    }
443 443

	
444 444
    Arc up(Node n) const {
445 445
      if (n._id < _edge_limit) {
446 446
        return Arc((n._id << 1) | 1);
447 447
      } else {
448 448
        return INVALID;
449 449
      }
450 450
    }
451 451

	
452 452
    Arc down(Node n) const {
453 453
      if (n._id >= _width) {
454 454
        return Arc((n._id - _width) << 1);
455 455
      } else {
456 456
        return INVALID;
457 457
      }
458 458
    }
459 459

	
460 460
  private:
461 461
    int _width, _height;
462 462
    int _node_num, _edge_num;
463 463
    int _edge_limit;
464 464
  };
465 465

	
466 466

	
467 467
  typedef GraphExtender<GridGraphBase> ExtendedGridGraphBase;
468 468

	
469 469
  /// \ingroup graphs
470 470
  ///
471 471
  /// \brief Grid graph class
472 472
  ///
473 473
  /// GridGraph implements a special graph type. The nodes of the
474 474
  /// graph can be indexed by two integer values \c (i,j) where \c i is
475 475
  /// in the range <tt>[0..width()-1]</tt> and j is in the range
476 476
  /// <tt>[0..height()-1]</tt>. Two nodes are connected in the graph if
477 477
  /// the indices differ exactly on one position and the difference is
478 478
  /// also exactly one. The nodes of the graph can be obtained by position
479 479
  /// using the \c operator()() function and the indices of the nodes can
480 480
  /// be obtained using \c pos(), \c col() and \c row() members. The outgoing
481 481
  /// arcs can be retrieved with the \c right(), \c up(), \c left()
482 482
  /// and \c down() functions, where the bottom-left corner is the
483 483
  /// origin.
484 484
  ///
485 485
  /// This class is completely static and it needs constant memory space.
486 486
  /// Thus you can neither add nor delete nodes or edges, however
487 487
  /// the structure can be resized using resize().
488 488
  ///
489 489
  /// \image html grid_graph.png
490 490
  /// \image latex grid_graph.eps "Grid graph" width=\textwidth
491 491
  ///
492 492
  /// A short example about the basic usage:
493 493
  ///\code
494 494
  /// GridGraph graph(rows, cols);
495 495
  /// GridGraph::NodeMap<int> val(graph);
496 496
  /// for (int i = 0; i < graph.width(); ++i) {
497 497
  ///   for (int j = 0; j < graph.height(); ++j) {
498 498
  ///     val[graph(i, j)] = i + j;
499 499
  ///   }
500 500
  /// }
501 501
  ///\endcode
502 502
  ///
503 503
  /// This type fully conforms to the \ref concepts::Graph "Graph concept".
504 504
  /// Most of its member functions and nested classes are documented
505 505
  /// only in the concept class.
506
  ///
507
  /// This class provides constant time counting for nodes, edges and arcs.
506 508
  class GridGraph : public ExtendedGridGraphBase {
507 509
    typedef ExtendedGridGraphBase Parent;
508 510

	
509 511
  public:
510 512

	
511 513
    /// \brief Map to get the indices of the nodes as \ref dim2::Point
512 514
    /// "dim2::Point<int>".
513 515
    ///
514 516
    /// Map to get the indices of the nodes as \ref dim2::Point
515 517
    /// "dim2::Point<int>".
516 518
    class IndexMap {
517 519
    public:
518 520
      /// \brief The key type of the map
519 521
      typedef GridGraph::Node Key;
520 522
      /// \brief The value type of the map
521 523
      typedef dim2::Point<int> Value;
522 524

	
523 525
      /// \brief Constructor
524 526
      IndexMap(const GridGraph& graph) : _graph(graph) {}
525 527

	
526 528
      /// \brief The subscript operator
527 529
      Value operator[](Key key) const {
528 530
        return _graph.pos(key);
529 531
      }
530 532

	
531 533
    private:
532 534
      const GridGraph& _graph;
533 535
    };
534 536

	
535 537
    /// \brief Map to get the column of the nodes.
536 538
    ///
537 539
    /// Map to get the column of the nodes.
538 540
    class ColMap {
539 541
    public:
540 542
      /// \brief The key type of the map
541 543
      typedef GridGraph::Node Key;
542 544
      /// \brief The value type of the map
543 545
      typedef int Value;
544 546

	
545 547
      /// \brief Constructor
546 548
      ColMap(const GridGraph& graph) : _graph(graph) {}
547 549

	
548 550
      /// \brief The subscript operator
549 551
      Value operator[](Key key) const {
550 552
        return _graph.col(key);
551 553
      }
552 554

	
553 555
    private:
554 556
      const GridGraph& _graph;
555 557
    };
556 558

	
557 559
    /// \brief Map to get the row of the nodes.
558 560
    ///
559 561
    /// Map to get the row of the nodes.
560 562
    class RowMap {
561 563
    public:
562 564
      /// \brief The key type of the map
563 565
      typedef GridGraph::Node Key;
564 566
      /// \brief The value type of the map
565 567
      typedef int Value;
566 568

	
567 569
      /// \brief Constructor
568 570
      RowMap(const GridGraph& graph) : _graph(graph) {}
569 571

	
570 572
      /// \brief The subscript operator
571 573
      Value operator[](Key key) const {
572 574
        return _graph.row(key);
573 575
      }
574 576

	
575 577
    private:
576 578
      const GridGraph& _graph;
577 579
    };
578 580

	
579 581
    /// \brief Constructor
580 582
    ///
581 583
    /// Construct a grid graph with the given size.
582 584
    GridGraph(int width, int height) { construct(width, height); }
583 585

	
584 586
    /// \brief Resizes the graph
585 587
    ///
586 588
    /// This function resizes the graph. It fully destroys and
587 589
    /// rebuilds the structure, therefore the maps of the graph will be
588 590
    /// reallocated automatically and the previous values will be lost.
589 591
    void resize(int width, int height) {
590 592
      Parent::notifier(Arc()).clear();
591 593
      Parent::notifier(Edge()).clear();
592 594
      Parent::notifier(Node()).clear();
593 595
      construct(width, height);
594 596
      Parent::notifier(Node()).build();
595 597
      Parent::notifier(Edge()).build();
596 598
      Parent::notifier(Arc()).build();
597 599
    }
598 600

	
599 601
    /// \brief The node on the given position.
600 602
    ///
601 603
    /// Gives back the node on the given position.
602 604
    Node operator()(int i, int j) const {
603 605
      return Parent::operator()(i, j);
604 606
    }
605 607

	
606 608
    /// \brief The column index of the node.
607 609
    ///
608 610
    /// Gives back the column index of the node.
609 611
    int col(Node n) const {
610 612
      return Parent::col(n);
611 613
    }
612 614

	
613 615
    /// \brief The row index of the node.
614 616
    ///
615 617
    /// Gives back the row index of the node.
616 618
    int row(Node n) const {
617 619
      return Parent::row(n);
618 620
    }
619 621

	
620 622
    /// \brief The position of the node.
621 623
    ///
622 624
    /// Gives back the position of the node, ie. the <tt>(col,row)</tt> pair.
623 625
    dim2::Point<int> pos(Node n) const {
624 626
      return Parent::pos(n);
625 627
    }
626 628

	
627 629
    /// \brief The number of the columns.
628 630
    ///
629 631
    /// Gives back the number of the columns.
630 632
    int width() const {
631 633
      return Parent::width();
632 634
    }
633 635

	
634 636
    /// \brief The number of the rows.
635 637
    ///
636 638
    /// Gives back the number of the rows.
637 639
    int height() const {
638 640
      return Parent::height();
639 641
    }
640 642

	
641 643
    /// \brief The arc goes right from the node.
642 644
    ///
643 645
    /// Gives back the arc goes right from the node. If there is not
644 646
    /// outgoing arc then it gives back INVALID.
645 647
    Arc right(Node n) const {
646 648
      return Parent::right(n);
647 649
    }
648 650

	
649 651
    /// \brief The arc goes left from the node.
650 652
    ///
651 653
    /// Gives back the arc goes left from the node. If there is not
652 654
    /// outgoing arc then it gives back INVALID.
653 655
    Arc left(Node n) const {
654 656
      return Parent::left(n);
655 657
    }
656 658

	
657 659
    /// \brief The arc goes up from the node.
658 660
    ///
659 661
    /// Gives back the arc goes up from the node. If there is not
660 662
    /// outgoing arc then it gives back INVALID.
661 663
    Arc up(Node n) const {
662 664
      return Parent::up(n);
663 665
    }
664 666

	
665 667
    /// \brief The arc goes down from the node.
666 668
    ///
667 669
    /// Gives back the arc goes down from the node. If there is not
668 670
    /// outgoing arc then it gives back INVALID.
669 671
    Arc down(Node n) const {
670 672
      return Parent::down(n);
671 673
    }
672 674

	
673 675
    /// \brief Index map of the grid graph
674 676
    ///
675 677
    /// Just returns an IndexMap for the grid graph.
676 678
    IndexMap indexMap() const {
677 679
      return IndexMap(*this);
678 680
    }
679 681

	
680 682
    /// \brief Row map of the grid graph
681 683
    ///
682 684
    /// Just returns a RowMap for the grid graph.
683 685
    RowMap rowMap() const {
684 686
      return RowMap(*this);
685 687
    }
686 688

	
687 689
    /// \brief Column map of the grid graph
688 690
    ///
689 691
    /// Just returns a ColMap for the grid graph.
690 692
    ColMap colMap() const {
691 693
      return ColMap(*this);
692 694
    }
693 695

	
694 696
  };
695 697

	
696 698
}
697 699
#endif
Show white space 384 line context
... ...
@@ -105,353 +105,355 @@
105 105
      if (d == 0) return INVALID;
106 106
      for ( ; (d & 1) == 0; d >>= 1) ++k;
107 107
      if (d >> 1 != 0) return INVALID;
108 108
      return (k << (_dim-1)) | ((u._id >> (k+1)) << k) |
109 109
        (u._id & ((1 << k) - 1));
110 110
    }
111 111

	
112 112
    Arc findArc(Node u, Node v, Arc prev = INVALID) const {
113 113
      Edge edge = findEdge(u, v, prev);
114 114
      if (edge == INVALID) return INVALID;
115 115
      int k = edge._id >> (_dim-1);
116 116
      return ((u._id >> k) & 1) == 1 ? edge._id << 1 : (edge._id << 1) | 1;
117 117
    }
118 118

	
119 119
    class Node {
120 120
      friend class HypercubeGraphBase;
121 121

	
122 122
    protected:
123 123
      int _id;
124 124
      Node(int id) : _id(id) {}
125 125
    public:
126 126
      Node() {}
127 127
      Node (Invalid) : _id(-1) {}
128 128
      bool operator==(const Node node) const {return _id == node._id;}
129 129
      bool operator!=(const Node node) const {return _id != node._id;}
130 130
      bool operator<(const Node node) const {return _id < node._id;}
131 131
    };
132 132

	
133 133
    class Edge {
134 134
      friend class HypercubeGraphBase;
135 135
      friend class Arc;
136 136

	
137 137
    protected:
138 138
      int _id;
139 139

	
140 140
      Edge(int id) : _id(id) {}
141 141

	
142 142
    public:
143 143
      Edge() {}
144 144
      Edge (Invalid) : _id(-1) {}
145 145
      bool operator==(const Edge edge) const {return _id == edge._id;}
146 146
      bool operator!=(const Edge edge) const {return _id != edge._id;}
147 147
      bool operator<(const Edge edge) const {return _id < edge._id;}
148 148
    };
149 149

	
150 150
    class Arc {
151 151
      friend class HypercubeGraphBase;
152 152

	
153 153
    protected:
154 154
      int _id;
155 155

	
156 156
      Arc(int id) : _id(id) {}
157 157

	
158 158
    public:
159 159
      Arc() {}
160 160
      Arc (Invalid) : _id(-1) {}
161 161
      operator Edge() const { return _id != -1 ? Edge(_id >> 1) : INVALID; }
162 162
      bool operator==(const Arc arc) const {return _id == arc._id;}
163 163
      bool operator!=(const Arc arc) const {return _id != arc._id;}
164 164
      bool operator<(const Arc arc) const {return _id < arc._id;}
165 165
    };
166 166

	
167 167
    void first(Node& node) const {
168 168
      node._id = _node_num - 1;
169 169
    }
170 170

	
171 171
    static void next(Node& node) {
172 172
      --node._id;
173 173
    }
174 174

	
175 175
    void first(Edge& edge) const {
176 176
      edge._id = _edge_num - 1;
177 177
    }
178 178

	
179 179
    static void next(Edge& edge) {
180 180
      --edge._id;
181 181
    }
182 182

	
183 183
    void first(Arc& arc) const {
184 184
      arc._id = 2 * _edge_num - 1;
185 185
    }
186 186

	
187 187
    static void next(Arc& arc) {
188 188
      --arc._id;
189 189
    }
190 190

	
191 191
    void firstInc(Edge& edge, bool& dir, const Node& node) const {
192 192
      edge._id = node._id >> 1;
193 193
      dir = (node._id & 1) == 0;
194 194
    }
195 195

	
196 196
    void nextInc(Edge& edge, bool& dir) const {
197 197
      Node n = dir ? u(edge) : v(edge);
198 198
      int k = (edge._id >> (_dim-1)) + 1;
199 199
      if (k < _dim) {
200 200
        edge._id = (k << (_dim-1)) |
201 201
          ((n._id >> (k+1)) << k) | (n._id & ((1 << k) - 1));
202 202
        dir = ((n._id >> k) & 1) == 0;
203 203
      } else {
204 204
        edge._id = -1;
205 205
        dir = true;
206 206
      }
207 207
    }
208 208

	
209 209
    void firstOut(Arc& arc, const Node& node) const {
210 210
      arc._id = ((node._id >> 1) << 1) | (~node._id & 1);
211 211
    }
212 212

	
213 213
    void nextOut(Arc& arc) const {
214 214
      Node n = (arc._id & 1) == 1 ? u(arc) : v(arc);
215 215
      int k = (arc._id >> _dim) + 1;
216 216
      if (k < _dim) {
217 217
        arc._id = (k << (_dim-1)) |
218 218
          ((n._id >> (k+1)) << k) | (n._id & ((1 << k) - 1));
219 219
        arc._id = (arc._id << 1) | (~(n._id >> k) & 1);
220 220
      } else {
221 221
        arc._id = -1;
222 222
      }
223 223
    }
224 224

	
225 225
    void firstIn(Arc& arc, const Node& node) const {
226 226
      arc._id = ((node._id >> 1) << 1) | (node._id & 1);
227 227
    }
228 228

	
229 229
    void nextIn(Arc& arc) const {
230 230
      Node n = (arc._id & 1) == 1 ? v(arc) : u(arc);
231 231
      int k = (arc._id >> _dim) + 1;
232 232
      if (k < _dim) {
233 233
        arc._id = (k << (_dim-1)) |
234 234
          ((n._id >> (k+1)) << k) | (n._id & ((1 << k) - 1));
235 235
        arc._id = (arc._id << 1) | ((n._id >> k) & 1);
236 236
      } else {
237 237
        arc._id = -1;
238 238
      }
239 239
    }
240 240

	
241 241
    static bool direction(Arc arc) {
242 242
      return (arc._id & 1) == 1;
243 243
    }
244 244

	
245 245
    static Arc direct(Edge edge, bool dir) {
246 246
      return Arc((edge._id << 1) | (dir ? 1 : 0));
247 247
    }
248 248

	
249 249
    int dimension() const {
250 250
      return _dim;
251 251
    }
252 252

	
253 253
    bool projection(Node node, int n) const {
254 254
      return static_cast<bool>(node._id & (1 << n));
255 255
    }
256 256

	
257 257
    int dimension(Edge edge) const {
258 258
      return edge._id >> (_dim-1);
259 259
    }
260 260

	
261 261
    int dimension(Arc arc) const {
262 262
      return arc._id >> _dim;
263 263
    }
264 264

	
265 265
    static int index(Node node) {
266 266
      return node._id;
267 267
    }
268 268

	
269 269
    Node operator()(int ix) const {
270 270
      return Node(ix);
271 271
    }
272 272

	
273 273
  private:
274 274
    int _dim;
275 275
    int _node_num, _edge_num;
276 276
  };
277 277

	
278 278

	
279 279
  typedef GraphExtender<HypercubeGraphBase> ExtendedHypercubeGraphBase;
280 280

	
281 281
  /// \ingroup graphs
282 282
  ///
283 283
  /// \brief Hypercube graph class
284 284
  ///
285 285
  /// HypercubeGraph implements a special graph type. The nodes of the
286 286
  /// graph are indexed with integers having at most \c dim binary digits.
287 287
  /// Two nodes are connected in the graph if and only if their indices
288 288
  /// differ only on one position in the binary form.
289 289
  /// This class is completely static and it needs constant memory space.
290 290
  /// Thus you can neither add nor delete nodes or edges, however 
291 291
  /// the structure can be resized using resize().
292 292
  ///
293 293
  /// This type fully conforms to the \ref concepts::Graph "Graph concept".
294 294
  /// Most of its member functions and nested classes are documented
295 295
  /// only in the concept class.
296 296
  ///
297
  /// This class provides constant time counting for nodes, edges and arcs.
298
  ///
297 299
  /// \note The type of the indices is chosen to \c int for efficiency
298 300
  /// reasons. Thus the maximum dimension of this implementation is 26
299 301
  /// (assuming that the size of \c int is 32 bit).
300 302
  class HypercubeGraph : public ExtendedHypercubeGraphBase {
301 303
    typedef ExtendedHypercubeGraphBase Parent;
302 304

	
303 305
  public:
304 306

	
305 307
    /// \brief Constructs a hypercube graph with \c dim dimensions.
306 308
    ///
307 309
    /// Constructs a hypercube graph with \c dim dimensions.
308 310
    HypercubeGraph(int dim) { construct(dim); }
309 311

	
310 312
    /// \brief Resizes the graph
311 313
    ///
312 314
    /// This function resizes the graph. It fully destroys and
313 315
    /// rebuilds the structure, therefore the maps of the graph will be
314 316
    /// reallocated automatically and the previous values will be lost.
315 317
    void resize(int dim) {
316 318
      Parent::notifier(Arc()).clear();
317 319
      Parent::notifier(Edge()).clear();
318 320
      Parent::notifier(Node()).clear();
319 321
      construct(dim);
320 322
      Parent::notifier(Node()).build();
321 323
      Parent::notifier(Edge()).build();
322 324
      Parent::notifier(Arc()).build();
323 325
    }
324 326

	
325 327
    /// \brief The number of dimensions.
326 328
    ///
327 329
    /// Gives back the number of dimensions.
328 330
    int dimension() const {
329 331
      return Parent::dimension();
330 332
    }
331 333

	
332 334
    /// \brief Returns \c true if the n'th bit of the node is one.
333 335
    ///
334 336
    /// Returns \c true if the n'th bit of the node is one.
335 337
    bool projection(Node node, int n) const {
336 338
      return Parent::projection(node, n);
337 339
    }
338 340

	
339 341
    /// \brief The dimension id of an edge.
340 342
    ///
341 343
    /// Gives back the dimension id of the given edge.
342 344
    /// It is in the range <tt>[0..dim-1]</tt>.
343 345
    int dimension(Edge edge) const {
344 346
      return Parent::dimension(edge);
345 347
    }
346 348

	
347 349
    /// \brief The dimension id of an arc.
348 350
    ///
349 351
    /// Gives back the dimension id of the given arc.
350 352
    /// It is in the range <tt>[0..dim-1]</tt>.
351 353
    int dimension(Arc arc) const {
352 354
      return Parent::dimension(arc);
353 355
    }
354 356

	
355 357
    /// \brief The index of a node.
356 358
    ///
357 359
    /// Gives back the index of the given node.
358 360
    /// The lower bits of the integer describes the node.
359 361
    static int index(Node node) {
360 362
      return Parent::index(node);
361 363
    }
362 364

	
363 365
    /// \brief Gives back a node by its index.
364 366
    ///
365 367
    /// Gives back a node by its index.
366 368
    Node operator()(int ix) const {
367 369
      return Parent::operator()(ix);
368 370
    }
369 371

	
370 372
    /// \brief Number of nodes.
371 373
    int nodeNum() const { return Parent::nodeNum(); }
372 374
    /// \brief Number of edges.
373 375
    int edgeNum() const { return Parent::edgeNum(); }
374 376
    /// \brief Number of arcs.
375 377
    int arcNum() const { return Parent::arcNum(); }
376 378

	
377 379
    /// \brief Linear combination map.
378 380
    ///
379 381
    /// This map makes possible to give back a linear combination
380 382
    /// for each node. It works like the \c std::accumulate function,
381 383
    /// so it accumulates the \c bf binary function with the \c fv first
382 384
    /// value. The map accumulates only on that positions (dimensions)
383 385
    /// where the index of the node is one. The values that have to be
384 386
    /// accumulated should be given by the \c begin and \c end iterators
385 387
    /// and the length of this range should be equal to the dimension
386 388
    /// number of the graph.
387 389
    ///
388 390
    ///\code
389 391
    /// const int DIM = 3;
390 392
    /// HypercubeGraph graph(DIM);
391 393
    /// dim2::Point<double> base[DIM];
392 394
    /// for (int k = 0; k < DIM; ++k) {
393 395
    ///   base[k].x = rnd();
394 396
    ///   base[k].y = rnd();
395 397
    /// }
396 398
    /// HypercubeGraph::HyperMap<dim2::Point<double> >
397 399
    ///   pos(graph, base, base + DIM, dim2::Point<double>(0.0, 0.0));
398 400
    ///\endcode
399 401
    ///
400 402
    /// \see HypercubeGraph
401 403
    template <typename T, typename BF = std::plus<T> >
402 404
    class HyperMap {
403 405
    public:
404 406

	
405 407
      /// \brief The key type of the map
406 408
      typedef Node Key;
407 409
      /// \brief The value type of the map
408 410
      typedef T Value;
409 411

	
410 412
      /// \brief Constructor for HyperMap.
411 413
      ///
412 414
      /// Construct a HyperMap for the given graph. The values that have
413 415
      /// to be accumulated should be given by the \c begin and \c end
414 416
      /// iterators and the length of this range should be equal to the
415 417
      /// dimension number of the graph.
416 418
      ///
417 419
      /// This map accumulates the \c bf binary function with the \c fv
418 420
      /// first value on that positions (dimensions) where the index of
419 421
      /// the node is one.
420 422
      template <typename It>
421 423
      HyperMap(const Graph& graph, It begin, It end,
422 424
               T fv = 0, const BF& bf = BF())
423 425
        : _graph(graph), _values(begin, end), _first_value(fv), _bin_func(bf)
424 426
      {
425 427
        LEMON_ASSERT(_values.size() == graph.dimension(),
426 428
                     "Wrong size of range");
427 429
      }
428 430

	
429 431
      /// \brief The partial accumulated value.
430 432
      ///
431 433
      /// Gives back the partial accumulated value.
432 434
      Value operator[](const Key& k) const {
433 435
        Value val = _first_value;
434 436
        int id = _graph.index(k);
435 437
        int n = 0;
436 438
        while (id != 0) {
437 439
          if (id & 1) {
438 440
            val = _bin_func(val, _values[n]);
439 441
          }
440 442
          id >>= 1;
441 443
          ++n;
442 444
        }
443 445
        return val;
444 446
      }
445 447

	
446 448
    private:
447 449
      const Graph& _graph;
448 450
      std::vector<T> _values;
449 451
      T _first_value;
450 452
      BF _bin_func;
451 453
    };
452 454

	
453 455
  };
454 456

	
455 457
}
456 458

	
457 459
#endif

Changeset was too big and was cut off... Show full diff

0 comments (0 inline)