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 with 93 insertions and 43 deletions:
↑ Collapse diff ↑
Ignore white space 6 line context
... ...
@@ -339,48 +339,51 @@
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.
... ...
@@ -698,48 +701,50 @@
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> >
... ...
@@ -1293,48 +1298,50 @@
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> >
... ...
@@ -1450,48 +1457,50 @@
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<
... ...
@@ -1598,48 +1607,50 @@
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> >, 
... ...
@@ -1708,48 +1719,50 @@
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 > >, 
... ...
@@ -2211,48 +2224,51 @@
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:
... ...
@@ -2514,48 +2530,51 @@
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:
... ...
@@ -2657,48 +2676,50 @@
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
... ...
@@ -3304,48 +3325,51 @@
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

	
Ignore white space 6 line context
... ...
@@ -680,54 +680,50 @@
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
... ...
@@ -1025,50 +1021,50 @@
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

	
... ...
@@ -1674,54 +1670,50 @@
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
Ignore white space 6 line context
... ...
@@ -612,54 +612,50 @@
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
... ...
@@ -955,50 +951,50 @@
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

	
... ...
@@ -1557,54 +1553,50 @@
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
Ignore white space 6 line context
... ...
@@ -185,49 +185,49 @@
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

	
Ignore white space 6 line context
... ...
@@ -234,55 +234,56 @@
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
      }
... ...
@@ -664,55 +665,56 @@
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();
... ...
@@ -933,55 +935,56 @@
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
    }
... ...
@@ -1283,55 +1286,56 @@
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
    }
Ignore white space 48 line context
... ...
@@ -141,98 +141,102 @@
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;
... ...
@@ -514,100 +518,104 @@
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

	
Ignore white space 6 line context
... ...
@@ -482,48 +482,50 @@
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
      }
Ignore white space 6 line context
... ...
@@ -273,48 +273,50 @@
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();
Ignore white space 6 line context
... ...
@@ -303,90 +303,99 @@
303 303
      arcs[e.id].source = n.id;
304 304
      arcs[e.id].prev_out = -1;
305 305
      arcs[e.id].next_out = nodes[n.id].first_out;
306 306
      nodes[n.id].first_out = e.id;
307 307
    }
308 308

	
309 309
  };
310 310

	
311 311
  typedef DigraphExtender<ListDigraphBase> ExtendedListDigraphBase;
312 312

	
313 313
  /// \addtogroup graphs
314 314
  /// @{
315 315

	
316 316
  ///A general directed graph structure.
317 317

	
318 318
  ///\ref ListDigraph is a versatile and fast directed graph
319 319
  ///implementation based on linked lists that are stored in
320 320
  ///\c std::vector structures.
321 321
  ///
322 322
  ///This type fully conforms to the \ref concepts::Digraph "Digraph concept"
323 323
  ///and it also provides several useful additional functionalities.
324 324
  ///Most of its member functions and nested classes are documented
325 325
  ///only in the concept class.
326 326
  ///
327
  ///This class provides only linear time counting for nodes and arcs.
328
  ///
327 329
  ///\sa concepts::Digraph
328 330
  ///\sa ListGraph
329 331
  class ListDigraph : public ExtendedListDigraphBase {
330 332
    typedef ExtendedListDigraphBase Parent;
331 333

	
332 334
  private:
333 335
    /// Digraphs are \e not copy constructible. Use DigraphCopy instead.
334 336
    ListDigraph(const ListDigraph &) :ExtendedListDigraphBase() {};
335 337
    /// \brief Assignment of a digraph to another one is \e not allowed.
336 338
    /// Use DigraphCopy instead.
337 339
    void operator=(const ListDigraph &) {}
338 340
  public:
339 341

	
340 342
    /// Constructor
341 343

	
342 344
    /// Constructor.
343 345
    ///
344 346
    ListDigraph() {}
345 347

	
346 348
    ///Add a new node to the digraph.
347 349

	
348 350
    ///This function adds a new node to the digraph.
349 351
    ///\return The new node.
350 352
    Node addNode() { return Parent::addNode(); }
351 353

	
352 354
    ///Add a new arc to the digraph.
353 355

	
354 356
    ///This function adds a new arc to the digraph with source node \c s
355 357
    ///and target node \c t.
356 358
    ///\return The new arc.
357 359
    Arc addArc(Node s, Node t) {
358 360
      return Parent::addArc(s, t);
359 361
    }
360 362

	
361 363
    ///\brief Erase a node from the digraph.
362 364
    ///
363
    ///This function erases the given node from the digraph.
365
    ///This function erases the given node along with its outgoing and
366
    ///incoming arcs from the digraph.
367
    ///
368
    ///\note All iterators referencing the removed node or the connected
369
    ///arcs are invalidated, of course.
364 370
    void erase(Node n) { Parent::erase(n); }
365 371

	
366 372
    ///\brief Erase an arc from the digraph.
367 373
    ///
368 374
    ///This function erases the given arc from the digraph.
375
    ///
376
    ///\note All iterators referencing the removed arc are invalidated,
377
    ///of course.
369 378
    void erase(Arc a) { Parent::erase(a); }
370 379

	
371 380
    /// Node validity check
372 381

	
373 382
    /// This function gives back \c true if the given node is valid,
374 383
    /// i.e. it is a real node of the digraph.
375 384
    ///
376 385
    /// \warning A removed node could become valid again if new nodes are
377 386
    /// added to the digraph.
378 387
    bool valid(Node n) const { return Parent::valid(n); }
379 388

	
380 389
    /// Arc validity check
381 390

	
382 391
    /// This function gives back \c true if the given arc is valid,
383 392
    /// i.e. it is a real arc of the digraph.
384 393
    ///
385 394
    /// \warning A removed arc could become valid again if new arcs are
386 395
    /// added to the digraph.
387 396
    bool valid(Arc a) const { return Parent::valid(a); }
388 397

	
389 398
    /// Change the target node of an arc
390 399

	
391 400
    /// This function changes the target node of the given arc \c a to \c n.
392 401
    ///
... ...
@@ -489,48 +498,49 @@
489 498
    ///Split an arc.
490 499

	
491 500
    ///This function splits the given arc. First, a new node \c v is
492 501
    ///added to the digraph, then the target node of the original arc
493 502
    ///is set to \c v. Finally, an arc from \c v to the original target
494 503
    ///is added.
495 504
    ///\return The newly created node.
496 505
    ///
497 506
    ///\note \c InArcIt iterators referencing the original arc are
498 507
    ///invalidated. Other iterators remain valid.
499 508
    ///
500 509
    ///\warning This functionality cannot be used together with the
501 510
    ///Snapshot feature.
502 511
    Node split(Arc a) {
503 512
      Node v = addNode();
504 513
      addArc(v,target(a));
505 514
      changeTarget(a,v);
506 515
      return v;
507 516
    }
508 517

	
509 518
    ///Clear the digraph.
510 519

	
511 520
    ///This function erases all nodes and arcs from the digraph.
512 521
    ///
522
    ///\note All iterators of the digraph are invalidated, of course.
513 523
    void clear() {
514 524
      Parent::clear();
515 525
    }
516 526

	
517 527
    /// Reserve memory for nodes.
518 528

	
519 529
    /// Using this function, it is possible to avoid superfluous memory
520 530
    /// allocation: if you know that the digraph you want to build will
521 531
    /// be large (e.g. it will contain millions of nodes and/or arcs),
522 532
    /// then it is worth reserving space for this amount before starting
523 533
    /// to build the digraph.
524 534
    /// \sa reserveArc()
525 535
    void reserveNode(int n) { nodes.reserve(n); };
526 536

	
527 537
    /// Reserve memory for arcs.
528 538

	
529 539
    /// Using this function, it is possible to avoid superfluous memory
530 540
    /// allocation: if you know that the digraph you want to build will
531 541
    /// be large (e.g. it will contain millions of nodes and/or arcs),
532 542
    /// then it is worth reserving space for this amount before starting
533 543
    /// to build the digraph.
534 544
    /// \sa reserveNode()
535 545
    void reserveArc(int m) { arcs.reserve(m); };
536 546

	
... ...
@@ -1158,92 +1168,101 @@
1158 1168
      arcs[(2 * e.id) | 1].prev_out = -1;
1159 1169
      arcs[(2 * e.id) | 1].next_out = nodes[n.id].first_out;
1160 1170
      nodes[n.id].first_out = ((2 * e.id) | 1);
1161 1171
    }
1162 1172

	
1163 1173
  };
1164 1174

	
1165 1175
  typedef GraphExtender<ListGraphBase> ExtendedListGraphBase;
1166 1176

	
1167 1177

	
1168 1178
  /// \addtogroup graphs
1169 1179
  /// @{
1170 1180

	
1171 1181
  ///A general undirected graph structure.
1172 1182

	
1173 1183
  ///\ref ListGraph is a versatile and fast undirected graph
1174 1184
  ///implementation based on linked lists that are stored in
1175 1185
  ///\c std::vector structures.
1176 1186
  ///
1177 1187
  ///This type fully conforms to the \ref concepts::Graph "Graph concept"
1178 1188
  ///and it also provides several useful additional functionalities.
1179 1189
  ///Most of its member functions and nested classes are documented
1180 1190
  ///only in the concept class.
1181 1191
  ///
1192
  ///This class provides only linear time counting for nodes, edges and arcs.
1193
  ///
1182 1194
  ///\sa concepts::Graph
1183 1195
  ///\sa ListDigraph
1184 1196
  class ListGraph : public ExtendedListGraphBase {
1185 1197
    typedef ExtendedListGraphBase Parent;
1186 1198

	
1187 1199
  private:
1188 1200
    /// Graphs are \e not copy constructible. Use GraphCopy instead.
1189 1201
    ListGraph(const ListGraph &) :ExtendedListGraphBase()  {};
1190 1202
    /// \brief Assignment of a graph to another one is \e not allowed.
1191 1203
    /// Use GraphCopy instead.
1192 1204
    void operator=(const ListGraph &) {}
1193 1205
  public:
1194 1206
    /// Constructor
1195 1207

	
1196 1208
    /// Constructor.
1197 1209
    ///
1198 1210
    ListGraph() {}
1199 1211

	
1200 1212
    typedef Parent::OutArcIt IncEdgeIt;
1201 1213

	
1202 1214
    /// \brief Add a new node to the graph.
1203 1215
    ///
1204 1216
    /// This function adds a new node to the graph.
1205 1217
    /// \return The new node.
1206 1218
    Node addNode() { return Parent::addNode(); }
1207 1219

	
1208 1220
    /// \brief Add a new edge to the graph.
1209 1221
    ///
1210 1222
    /// This function adds a new edge to the graph between nodes
1211 1223
    /// \c u and \c v with inherent orientation from node \c u to
1212 1224
    /// node \c v.
1213 1225
    /// \return The new edge.
1214 1226
    Edge addEdge(Node u, Node v) {
1215 1227
      return Parent::addEdge(u, v);
1216 1228
    }
1217 1229

	
1218 1230
    ///\brief Erase a node from the graph.
1219 1231
    ///
1220
    /// This function erases the given node from the graph.
1232
    /// This function erases the given node along with its incident arcs
1233
    /// from the graph.
1234
    ///
1235
    /// \note All iterators referencing the removed node or the incident
1236
    /// edges are invalidated, of course.
1221 1237
    void erase(Node n) { Parent::erase(n); }
1222 1238

	
1223 1239
    ///\brief Erase an edge from the graph.
1224 1240
    ///
1225 1241
    /// This function erases the given edge from the graph.
1242
    ///
1243
    /// \note All iterators referencing the removed edge are invalidated,
1244
    /// of course.
1226 1245
    void erase(Edge e) { Parent::erase(e); }
1227 1246
    /// Node validity check
1228 1247

	
1229 1248
    /// This function gives back \c true if the given node is valid,
1230 1249
    /// i.e. it is a real node of the graph.
1231 1250
    ///
1232 1251
    /// \warning A removed node could become valid again if new nodes are
1233 1252
    /// added to the graph.
1234 1253
    bool valid(Node n) const { return Parent::valid(n); }
1235 1254
    /// Edge validity check
1236 1255

	
1237 1256
    /// This function gives back \c true if the given edge is valid,
1238 1257
    /// i.e. it is a real edge of the graph.
1239 1258
    ///
1240 1259
    /// \warning A removed edge could become valid again if new edges are
1241 1260
    /// added to the graph.
1242 1261
    bool valid(Edge e) const { return Parent::valid(e); }
1243 1262
    /// Arc validity check
1244 1263

	
1245 1264
    /// This function gives back \c true if the given arc is valid,
1246 1265
    /// i.e. it is a real arc of the graph.
1247 1266
    ///
1248 1267
    /// \warning A removed arc could become valid again if new edges are
1249 1268
    /// added to the graph.
... ...
@@ -1291,48 +1310,49 @@
1291 1310
    /// Moreover all iterators referencing node \c b or the removed 
1292 1311
    /// loops are also invalidated. Other iterators remain valid.
1293 1312
    ///
1294 1313
    ///\warning This functionality cannot be used together with the
1295 1314
    ///Snapshot feature.
1296 1315
    void contract(Node a, Node b, bool r = true) {
1297 1316
      for(IncEdgeIt e(*this, b); e!=INVALID;) {
1298 1317
        IncEdgeIt f = e; ++f;
1299 1318
        if (r && runningNode(e) == a) {
1300 1319
          erase(e);
1301 1320
        } else if (u(e) == b) {
1302 1321
          changeU(e, a);
1303 1322
        } else {
1304 1323
          changeV(e, a);
1305 1324
        }
1306 1325
        e = f;
1307 1326
      }
1308 1327
      erase(b);
1309 1328
    }
1310 1329

	
1311 1330
    ///Clear the graph.
1312 1331

	
1313 1332
    ///This function erases all nodes and arcs from the graph.
1314 1333
    ///
1334
    ///\note All iterators of the graph are invalidated, of course.
1315 1335
    void clear() {
1316 1336
      Parent::clear();
1317 1337
    }
1318 1338

	
1319 1339
    /// Reserve memory for nodes.
1320 1340

	
1321 1341
    /// Using this function, it is possible to avoid superfluous memory
1322 1342
    /// allocation: if you know that the graph you want to build will
1323 1343
    /// be large (e.g. it will contain millions of nodes and/or edges),
1324 1344
    /// then it is worth reserving space for this amount before starting
1325 1345
    /// to build the graph.
1326 1346
    /// \sa reserveEdge()
1327 1347
    void reserveNode(int n) { nodes.reserve(n); };
1328 1348

	
1329 1349
    /// Reserve memory for edges.
1330 1350

	
1331 1351
    /// Using this function, it is possible to avoid superfluous memory
1332 1352
    /// allocation: if you know that the graph you want to build will
1333 1353
    /// be large (e.g. it will contain millions of nodes and/or edges),
1334 1354
    /// then it is worth reserving space for this amount before starting
1335 1355
    /// to build the graph.
1336 1356
    /// \sa reserveNode()
1337 1357
    void reserveEdge(int m) { arcs.reserve(2 * m); };
1338 1358

	
Ignore white space 6 line context
... ...
@@ -173,48 +173,50 @@
173 173
    }
174 174

	
175 175
    void nextIn(Arc& arc) const {
176 176
      arc._id = arcs[arc._id].next_in;
177 177
    }
178 178

	
179 179
  };
180 180

	
181 181
  typedef DigraphExtender<SmartDigraphBase> ExtendedSmartDigraphBase;
182 182

	
183 183
  ///\ingroup graphs
184 184
  ///
185 185
  ///\brief A smart directed graph class.
186 186
  ///
187 187
  ///\ref SmartDigraph is a simple and fast digraph implementation.
188 188
  ///It is also quite memory efficient but at the price
189 189
  ///that it does not support node and arc deletion 
190 190
  ///(except for the Snapshot feature).
191 191
  ///
192 192
  ///This type fully conforms to the \ref concepts::Digraph "Digraph concept"
193 193
  ///and it also provides some additional functionalities.
194 194
  ///Most of its member functions and nested classes are documented
195 195
  ///only in the concept class.
196 196
  ///
197
  ///This class provides constant time counting for nodes and arcs.
198
  ///
197 199
  ///\sa concepts::Digraph
198 200
  ///\sa SmartGraph
199 201
  class SmartDigraph : public ExtendedSmartDigraphBase {
200 202
    typedef ExtendedSmartDigraphBase Parent;
201 203

	
202 204
  private:
203 205
    /// Digraphs are \e not copy constructible. Use DigraphCopy instead.
204 206
    SmartDigraph(const SmartDigraph &) : ExtendedSmartDigraphBase() {};
205 207
    /// \brief Assignment of a digraph to another one is \e not allowed.
206 208
    /// Use DigraphCopy instead.
207 209
    void operator=(const SmartDigraph &) {}
208 210

	
209 211
  public:
210 212

	
211 213
    /// Constructor
212 214

	
213 215
    /// Constructor.
214 216
    ///
215 217
    SmartDigraph() {};
216 218

	
217 219
    ///Add a new node to the digraph.
218 220

	
219 221
    ///This function adds a new node to the digraph.
220 222
    ///\return The new node.
... ...
@@ -599,48 +601,50 @@
599 601

	
600 602
    void clear() {
601 603
      arcs.clear();
602 604
      nodes.clear();
603 605
    }
604 606

	
605 607
  };
606 608

	
607 609
  typedef GraphExtender<SmartGraphBase> ExtendedSmartGraphBase;
608 610

	
609 611
  /// \ingroup graphs
610 612
  ///
611 613
  /// \brief A smart undirected graph class.
612 614
  ///
613 615
  /// \ref SmartGraph is a simple and fast graph implementation.
614 616
  /// It is also quite memory efficient but at the price
615 617
  /// that it does not support node and edge deletion 
616 618
  /// (except for the Snapshot feature).
617 619
  ///
618 620
  /// This type fully conforms to the \ref concepts::Graph "Graph concept"
619 621
  /// and it also provides some additional functionalities.
620 622
  /// Most of its member functions and nested classes are documented
621 623
  /// only in the concept class.
622 624
  ///
625
  /// This class provides constant time counting for nodes, edges and arcs.
626
  ///
623 627
  /// \sa concepts::Graph
624 628
  /// \sa SmartDigraph
625 629
  class SmartGraph : public ExtendedSmartGraphBase {
626 630
    typedef ExtendedSmartGraphBase Parent;
627 631

	
628 632
  private:
629 633
    /// Graphs are \e not copy constructible. Use GraphCopy instead.
630 634
    SmartGraph(const SmartGraph &) : ExtendedSmartGraphBase() {};
631 635
    /// \brief Assignment of a graph to another one is \e not allowed.
632 636
    /// Use GraphCopy instead.
633 637
    void operator=(const SmartGraph &) {}
634 638

	
635 639
  public:
636 640

	
637 641
    /// Constructor
638 642

	
639 643
    /// Constructor.
640 644
    ///
641 645
    SmartGraph() {}
642 646

	
643 647
    /// \brief Add a new node to the graph.
644 648
    ///
645 649
    /// This function adds a new node to the graph.
646 650
    /// \return The new node.
Ignore white space 6 line context
... ...
@@ -271,48 +271,50 @@
271 271
  ///
272 272
  /// \brief A static directed graph class.
273 273
  ///
274 274
  /// \ref StaticDigraph is a highly efficient digraph implementation,
275 275
  /// but it is fully static.
276 276
  /// It stores only two \c int values for each node and only four \c int
277 277
  /// values for each arc. Moreover it provides faster item iteration than
278 278
  /// \ref ListDigraph and \ref SmartDigraph, especially using \c OutArcIt
279 279
  /// iterators, since its arcs are stored in an appropriate order.
280 280
  /// However it only provides build() and clear() functions and does not
281 281
  /// support any other modification of the digraph.
282 282
  ///
283 283
  /// Since this digraph structure is completely static, its nodes and arcs
284 284
  /// can be indexed with integers from the ranges <tt>[0..nodeNum()-1]</tt>
285 285
  /// and <tt>[0..arcNum()-1]</tt>, respectively. 
286 286
  /// The index of an item is the same as its ID, it can be obtained
287 287
  /// using the corresponding \ref index() or \ref concepts::Digraph::id()
288 288
  /// "id()" function. A node or arc with a certain index can be obtained
289 289
  /// using node() or arc().
290 290
  ///
291 291
  /// This type fully conforms to the \ref concepts::Digraph "Digraph concept".
292 292
  /// Most of its member functions and nested classes are documented
293 293
  /// only in the concept class.
294 294
  ///
295
  /// This class provides constant time counting for nodes and arcs.
296
  ///
295 297
  /// \sa concepts::Digraph
296 298
  class StaticDigraph : public ExtendedStaticDigraphBase {
297 299
  public:
298 300

	
299 301
    typedef ExtendedStaticDigraphBase Parent;
300 302
  
301 303
  public:
302 304
  
303 305
    /// \brief Constructor
304 306
    ///
305 307
    /// Default constructor.
306 308
    StaticDigraph() : Parent() {}
307 309

	
308 310
    /// \brief The node with the given index.
309 311
    ///
310 312
    /// This function returns the node with the given index.
311 313
    /// \sa index()
312 314
    static Node node(int ix) { return Parent::nodeFromId(ix); }
313 315

	
314 316
    /// \brief The arc with the given index.
315 317
    ///
316 318
    /// This function returns the arc with the given index.
317 319
    /// \sa index()
318 320
    static Arc arc(int ix) { return Parent::arcFromId(ix); }
0 comments (0 inline)