lemon/concepts/graph_components.h
author Peter Kovacs <kpeter@inf.elte.hu>
Thu, 12 Nov 2009 23:26:13 +0100
changeset 806 fa6f37d7a25b
parent 734 bd72f8d20f33
child 877 141f9c0db4a3
permissions -rw-r--r--
Entirely rework CapacityScaling (#180)

- Use the new interface similarly to NetworkSimplex.
- Rework the implementation using an efficient internal structure
for handling the residual network. This improvement made the
code much faster (up to 2-5 times faster on large graphs).
- Handle GEQ supply type (LEQ is not supported).
- Handle negative costs for arcs of finite capacity.
(Note that this algorithm cannot handle arcs of negative cost
and infinite upper bound, thus it returns UNBOUNDED if such
an arc exists.)
- Extend the documentation.
     1 /* -*- mode: C++; indent-tabs-mode: nil; -*-
     2  *
     3  * This file is a part of LEMON, a generic C++ optimization library.
     4  *
     5  * Copyright (C) 2003-2009
     6  * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
     7  * (Egervary Research Group on Combinatorial Optimization, EGRES).
     8  *
     9  * Permission to use, modify and distribute this software is granted
    10  * provided that this copyright notice appears in all copies. For
    11  * precise terms see the accompanying LICENSE file.
    12  *
    13  * This software is provided "AS IS" with no warranty of any kind,
    14  * express or implied, and with no claim as to its suitability for any
    15  * purpose.
    16  *
    17  */
    18 
    19 ///\ingroup graph_concepts
    20 ///\file
    21 ///\brief The concepts of graph components.
    22 
    23 #ifndef LEMON_CONCEPTS_GRAPH_COMPONENTS_H
    24 #define LEMON_CONCEPTS_GRAPH_COMPONENTS_H
    25 
    26 #include <lemon/core.h>
    27 #include <lemon/concepts/maps.h>
    28 
    29 #include <lemon/bits/alteration_notifier.h>
    30 
    31 namespace lemon {
    32   namespace concepts {
    33 
    34     /// \brief Concept class for \c Node, \c Arc and \c Edge types.
    35     ///
    36     /// This class describes the concept of \c Node, \c Arc and \c Edge
    37     /// subtypes of digraph and graph types.
    38     ///
    39     /// \note This class is a template class so that we can use it to
    40     /// create graph skeleton classes. The reason for this is that \c Node
    41     /// and \c Arc (or \c Edge) types should \e not derive from the same 
    42     /// base class. For \c Node you should instantiate it with character
    43     /// \c 'n', for \c Arc with \c 'a' and for \c Edge with \c 'e'.
    44 #ifndef DOXYGEN
    45     template <char sel = '0'>
    46 #endif
    47     class GraphItem {
    48     public:
    49       /// \brief Default constructor.
    50       ///
    51       /// Default constructor.
    52       /// \warning The default constructor is not required to set
    53       /// the item to some well-defined value. So you should consider it
    54       /// as uninitialized.
    55       GraphItem() {}
    56 
    57       /// \brief Copy constructor.
    58       ///
    59       /// Copy constructor.
    60       GraphItem(const GraphItem &) {}
    61 
    62       /// \brief Constructor for conversion from \c INVALID.
    63       ///
    64       /// Constructor for conversion from \c INVALID.
    65       /// It initializes the item to be invalid.
    66       /// \sa Invalid for more details.
    67       GraphItem(Invalid) {}
    68 
    69       /// \brief Assignment operator.
    70       ///
    71       /// Assignment operator for the item.
    72       GraphItem& operator=(const GraphItem&) { return *this; }
    73 
    74       /// \brief Assignment operator for INVALID.
    75       ///
    76       /// This operator makes the item invalid.
    77       GraphItem& operator=(Invalid) { return *this; }
    78 
    79       /// \brief Equality operator.
    80       ///
    81       /// Equality operator.
    82       bool operator==(const GraphItem&) const { return false; }
    83 
    84       /// \brief Inequality operator.
    85       ///
    86       /// Inequality operator.
    87       bool operator!=(const GraphItem&) const { return false; }
    88 
    89       /// \brief Ordering operator.
    90       ///
    91       /// This operator defines an ordering of the items.
    92       /// It makes possible to use graph item types as key types in 
    93       /// associative containers (e.g. \c std::map).
    94       ///
    95       /// \note This operator only has to define some strict ordering of
    96       /// the items; this order has nothing to do with the iteration
    97       /// ordering of the items.
    98       bool operator<(const GraphItem&) const { return false; }
    99 
   100       template<typename _GraphItem>
   101       struct Constraints {
   102         void constraints() {
   103           _GraphItem i1;
   104           i1=INVALID;
   105           _GraphItem i2 = i1;
   106           _GraphItem i3 = INVALID;
   107 
   108           i1 = i2 = i3;
   109 
   110           bool b;
   111           b = (ia == ib) && (ia != ib);
   112           b = (ia == INVALID) && (ib != INVALID);
   113           b = (ia < ib);
   114         }
   115 
   116         const _GraphItem &ia;
   117         const _GraphItem &ib;
   118       };
   119     };
   120 
   121     /// \brief Base skeleton class for directed graphs.
   122     ///
   123     /// This class describes the base interface of directed graph types.
   124     /// All digraph %concepts have to conform to this class.
   125     /// It just provides types for nodes and arcs and functions 
   126     /// to get the source and the target nodes of arcs.
   127     class BaseDigraphComponent {
   128     public:
   129 
   130       typedef BaseDigraphComponent Digraph;
   131 
   132       /// \brief Node class of the digraph.
   133       ///
   134       /// This class represents the nodes of the digraph.
   135       typedef GraphItem<'n'> Node;
   136 
   137       /// \brief Arc class of the digraph.
   138       ///
   139       /// This class represents the arcs of the digraph.
   140       typedef GraphItem<'a'> Arc;
   141 
   142       /// \brief Return the source node of an arc.
   143       ///
   144       /// This function returns the source node of an arc.
   145       Node source(const Arc&) const { return INVALID; }
   146 
   147       /// \brief Return the target node of an arc.
   148       ///
   149       /// This function returns the target node of an arc.
   150       Node target(const Arc&) const { return INVALID; }
   151 
   152       /// \brief Return the opposite node on the given arc.
   153       ///
   154       /// This function returns the opposite node on the given arc.
   155       Node oppositeNode(const Node&, const Arc&) const {
   156         return INVALID;
   157       }
   158 
   159       template <typename _Digraph>
   160       struct Constraints {
   161         typedef typename _Digraph::Node Node;
   162         typedef typename _Digraph::Arc Arc;
   163 
   164         void constraints() {
   165           checkConcept<GraphItem<'n'>, Node>();
   166           checkConcept<GraphItem<'a'>, Arc>();
   167           {
   168             Node n;
   169             Arc e(INVALID);
   170             n = digraph.source(e);
   171             n = digraph.target(e);
   172             n = digraph.oppositeNode(n, e);
   173           }
   174         }
   175 
   176         const _Digraph& digraph;
   177       };
   178     };
   179 
   180     /// \brief Base skeleton class for undirected graphs.
   181     ///
   182     /// This class describes the base interface of undirected graph types.
   183     /// All graph %concepts have to conform to this class.
   184     /// It extends the interface of \ref BaseDigraphComponent with an
   185     /// \c Edge type and functions to get the end nodes of edges,
   186     /// to convert from arcs to edges and to get both direction of edges.
   187     class BaseGraphComponent : public BaseDigraphComponent {
   188     public:
   189 
   190       typedef BaseGraphComponent Graph;
   191 
   192       typedef BaseDigraphComponent::Node Node;
   193       typedef BaseDigraphComponent::Arc Arc;
   194 
   195       /// \brief Undirected edge class of the graph.
   196       ///
   197       /// This class represents the undirected edges of the graph.
   198       /// Undirected graphs can be used as directed graphs, each edge is
   199       /// represented by two opposite directed arcs.
   200       class Edge : public GraphItem<'e'> {
   201         typedef GraphItem<'e'> Parent;
   202 
   203       public:
   204         /// \brief Default constructor.
   205         ///
   206         /// Default constructor.
   207         /// \warning The default constructor is not required to set
   208         /// the item to some well-defined value. So you should consider it
   209         /// as uninitialized.
   210         Edge() {}
   211 
   212         /// \brief Copy constructor.
   213         ///
   214         /// Copy constructor.
   215         Edge(const Edge &) : Parent() {}
   216 
   217         /// \brief Constructor for conversion from \c INVALID.
   218         ///
   219         /// Constructor for conversion from \c INVALID.
   220         /// It initializes the item to be invalid.
   221         /// \sa Invalid for more details.
   222         Edge(Invalid) {}
   223 
   224         /// \brief Constructor for conversion from an arc.
   225         ///
   226         /// Constructor for conversion from an arc.
   227         /// Besides the core graph item functionality each arc should
   228         /// be convertible to the represented edge.
   229         Edge(const Arc&) {}
   230      };
   231 
   232       /// \brief Return one end node of an edge.
   233       ///
   234       /// This function returns one end node of an edge.
   235       Node u(const Edge&) const { return INVALID; }
   236 
   237       /// \brief Return the other end node of an edge.
   238       ///
   239       /// This function returns the other end node of an edge.
   240       Node v(const Edge&) const { return INVALID; }
   241 
   242       /// \brief Return a directed arc related to an edge.
   243       ///
   244       /// This function returns a directed arc from its direction and the
   245       /// represented edge.
   246       Arc direct(const Edge&, bool) const { return INVALID; }
   247 
   248       /// \brief Return a directed arc related to an edge.
   249       ///
   250       /// This function returns a directed arc from its source node and the
   251       /// represented edge.
   252       Arc direct(const Edge&, const Node&) const { return INVALID; }
   253 
   254       /// \brief Return the direction of the arc.
   255       ///
   256       /// Returns the direction of the arc. Each arc represents an
   257       /// edge with a direction. It gives back the
   258       /// direction.
   259       bool direction(const Arc&) const { return true; }
   260 
   261       /// \brief Return the opposite arc.
   262       ///
   263       /// This function returns the opposite arc, i.e. the arc representing
   264       /// the same edge and has opposite direction.
   265       Arc oppositeArc(const Arc&) const { return INVALID; }
   266 
   267       template <typename _Graph>
   268       struct Constraints {
   269         typedef typename _Graph::Node Node;
   270         typedef typename _Graph::Arc Arc;
   271         typedef typename _Graph::Edge Edge;
   272 
   273         void constraints() {
   274           checkConcept<BaseDigraphComponent, _Graph>();
   275           checkConcept<GraphItem<'e'>, Edge>();
   276           {
   277             Node n;
   278             Edge ue(INVALID);
   279             Arc e;
   280             n = graph.u(ue);
   281             n = graph.v(ue);
   282             e = graph.direct(ue, true);
   283             e = graph.direct(ue, false);
   284             e = graph.direct(ue, n);
   285             e = graph.oppositeArc(e);
   286             ue = e;
   287             bool d = graph.direction(e);
   288             ignore_unused_variable_warning(d);
   289           }
   290         }
   291 
   292         const _Graph& graph;
   293       };
   294 
   295     };
   296 
   297     /// \brief Skeleton class for \e idable directed graphs.
   298     ///
   299     /// This class describes the interface of \e idable directed graphs.
   300     /// It extends \ref BaseDigraphComponent with the core ID functions.
   301     /// The ids of the items must be unique and immutable.
   302     /// This concept is part of the Digraph concept.
   303     template <typename BAS = BaseDigraphComponent>
   304     class IDableDigraphComponent : public BAS {
   305     public:
   306 
   307       typedef BAS Base;
   308       typedef typename Base::Node Node;
   309       typedef typename Base::Arc Arc;
   310 
   311       /// \brief Return a unique integer id for the given node.
   312       ///
   313       /// This function returns a unique integer id for the given node.
   314       int id(const Node&) const { return -1; }
   315 
   316       /// \brief Return the node by its unique id.
   317       ///
   318       /// This function returns the node by its unique id.
   319       /// If the digraph does not contain a node with the given id,
   320       /// then the result of the function is undefined.
   321       Node nodeFromId(int) const { return INVALID; }
   322 
   323       /// \brief Return a unique integer id for the given arc.
   324       ///
   325       /// This function returns a unique integer id for the given arc.
   326       int id(const Arc&) const { return -1; }
   327 
   328       /// \brief Return the arc by its unique id.
   329       ///
   330       /// This function returns the arc by its unique id.
   331       /// If the digraph does not contain an arc with the given id,
   332       /// then the result of the function is undefined.
   333       Arc arcFromId(int) const { return INVALID; }
   334 
   335       /// \brief Return an integer greater or equal to the maximum
   336       /// node id.
   337       ///
   338       /// This function returns an integer greater or equal to the
   339       /// maximum node id.
   340       int maxNodeId() const { return -1; }
   341 
   342       /// \brief Return an integer greater or equal to the maximum
   343       /// arc id.
   344       ///
   345       /// This function returns an integer greater or equal to the
   346       /// maximum arc id.
   347       int maxArcId() const { return -1; }
   348 
   349       template <typename _Digraph>
   350       struct Constraints {
   351 
   352         void constraints() {
   353           checkConcept<Base, _Digraph >();
   354           typename _Digraph::Node node;
   355           node=INVALID;
   356           int nid = digraph.id(node);
   357           nid = digraph.id(node);
   358           node = digraph.nodeFromId(nid);
   359           typename _Digraph::Arc arc;
   360           arc=INVALID;
   361           int eid = digraph.id(arc);
   362           eid = digraph.id(arc);
   363           arc = digraph.arcFromId(eid);
   364 
   365           nid = digraph.maxNodeId();
   366           ignore_unused_variable_warning(nid);
   367           eid = digraph.maxArcId();
   368           ignore_unused_variable_warning(eid);
   369         }
   370 
   371         const _Digraph& digraph;
   372       };
   373     };
   374 
   375     /// \brief Skeleton class for \e idable undirected graphs.
   376     ///
   377     /// This class describes the interface of \e idable undirected
   378     /// graphs. It extends \ref IDableDigraphComponent with the core ID
   379     /// functions of undirected graphs.
   380     /// The ids of the items must be unique and immutable.
   381     /// This concept is part of the Graph concept.
   382     template <typename BAS = BaseGraphComponent>
   383     class IDableGraphComponent : public IDableDigraphComponent<BAS> {
   384     public:
   385 
   386       typedef BAS Base;
   387       typedef typename Base::Edge Edge;
   388 
   389       using IDableDigraphComponent<Base>::id;
   390 
   391       /// \brief Return a unique integer id for the given edge.
   392       ///
   393       /// This function returns a unique integer id for the given edge.
   394       int id(const Edge&) const { return -1; }
   395 
   396       /// \brief Return the edge by its unique id.
   397       ///
   398       /// This function returns the edge by its unique id.
   399       /// If the graph does not contain an edge with the given id,
   400       /// then the result of the function is undefined.
   401       Edge edgeFromId(int) const { return INVALID; }
   402 
   403       /// \brief Return an integer greater or equal to the maximum
   404       /// edge id.
   405       ///
   406       /// This function returns an integer greater or equal to the
   407       /// maximum edge id.
   408       int maxEdgeId() const { return -1; }
   409 
   410       template <typename _Graph>
   411       struct Constraints {
   412 
   413         void constraints() {
   414           checkConcept<IDableDigraphComponent<Base>, _Graph >();
   415           typename _Graph::Edge edge;
   416           int ueid = graph.id(edge);
   417           ueid = graph.id(edge);
   418           edge = graph.edgeFromId(ueid);
   419           ueid = graph.maxEdgeId();
   420           ignore_unused_variable_warning(ueid);
   421         }
   422 
   423         const _Graph& graph;
   424       };
   425     };
   426 
   427     /// \brief Concept class for \c NodeIt, \c ArcIt and \c EdgeIt types.
   428     ///
   429     /// This class describes the concept of \c NodeIt, \c ArcIt and 
   430     /// \c EdgeIt subtypes of digraph and graph types.
   431     template <typename GR, typename Item>
   432     class GraphItemIt : public Item {
   433     public:
   434       /// \brief Default constructor.
   435       ///
   436       /// Default constructor.
   437       /// \warning The default constructor is not required to set
   438       /// the iterator to some well-defined value. So you should consider it
   439       /// as uninitialized.
   440       GraphItemIt() {}
   441 
   442       /// \brief Copy constructor.
   443       ///
   444       /// Copy constructor.
   445       GraphItemIt(const GraphItemIt& it) : Item(it) {}
   446 
   447       /// \brief Constructor that sets the iterator to the first item.
   448       ///
   449       /// Constructor that sets the iterator to the first item.
   450       explicit GraphItemIt(const GR&) {}
   451 
   452       /// \brief Constructor for conversion from \c INVALID.
   453       ///
   454       /// Constructor for conversion from \c INVALID.
   455       /// It initializes the iterator to be invalid.
   456       /// \sa Invalid for more details.
   457       GraphItemIt(Invalid) {}
   458 
   459       /// \brief Assignment operator.
   460       ///
   461       /// Assignment operator for the iterator.
   462       GraphItemIt& operator=(const GraphItemIt&) { return *this; }
   463 
   464       /// \brief Increment the iterator.
   465       ///
   466       /// This operator increments the iterator, i.e. assigns it to the
   467       /// next item.
   468       GraphItemIt& operator++() { return *this; }
   469  
   470       /// \brief Equality operator
   471       ///
   472       /// Equality operator.
   473       /// Two iterators are equal if and only if they point to the
   474       /// same object or both are invalid.
   475       bool operator==(const GraphItemIt&) const { return true;}
   476 
   477       /// \brief Inequality operator
   478       ///
   479       /// Inequality operator.
   480       /// Two iterators are equal if and only if they point to the
   481       /// same object or both are invalid.
   482       bool operator!=(const GraphItemIt&) const { return true;}
   483 
   484       template<typename _GraphItemIt>
   485       struct Constraints {
   486         void constraints() {
   487           checkConcept<GraphItem<>, _GraphItemIt>();
   488           _GraphItemIt it1(g);
   489           _GraphItemIt it2;
   490           _GraphItemIt it3 = it1;
   491           _GraphItemIt it4 = INVALID;
   492 
   493           it2 = ++it1;
   494           ++it2 = it1;
   495           ++(++it1);
   496 
   497           Item bi = it1;
   498           bi = it2;
   499         }
   500         const GR& g;
   501       };
   502     };
   503 
   504     /// \brief Concept class for \c InArcIt, \c OutArcIt and 
   505     /// \c IncEdgeIt types.
   506     ///
   507     /// This class describes the concept of \c InArcIt, \c OutArcIt 
   508     /// and \c IncEdgeIt subtypes of digraph and graph types.
   509     ///
   510     /// \note Since these iterator classes do not inherit from the same
   511     /// base class, there is an additional template parameter (selector)
   512     /// \c sel. For \c InArcIt you should instantiate it with character 
   513     /// \c 'i', for \c OutArcIt with \c 'o' and for \c IncEdgeIt with \c 'e'.
   514     template <typename GR,
   515               typename Item = typename GR::Arc,
   516               typename Base = typename GR::Node,
   517               char sel = '0'>
   518     class GraphIncIt : public Item {
   519     public:
   520       /// \brief Default constructor.
   521       ///
   522       /// Default constructor.
   523       /// \warning The default constructor is not required to set
   524       /// the iterator to some well-defined value. So you should consider it
   525       /// as uninitialized.
   526       GraphIncIt() {}
   527 
   528       /// \brief Copy constructor.
   529       ///
   530       /// Copy constructor.
   531       GraphIncIt(const GraphIncIt& it) : Item(it) {}
   532 
   533       /// \brief Constructor that sets the iterator to the first 
   534       /// incoming or outgoing arc.
   535       ///
   536       /// Constructor that sets the iterator to the first arc 
   537       /// incoming to or outgoing from the given node.
   538       explicit GraphIncIt(const GR&, const Base&) {}
   539 
   540       /// \brief Constructor for conversion from \c INVALID.
   541       ///
   542       /// Constructor for conversion from \c INVALID.
   543       /// It initializes the iterator to be invalid.
   544       /// \sa Invalid for more details.
   545       GraphIncIt(Invalid) {}
   546 
   547       /// \brief Assignment operator.
   548       ///
   549       /// Assignment operator for the iterator.
   550       GraphIncIt& operator=(const GraphIncIt&) { return *this; }
   551 
   552       /// \brief Increment the iterator.
   553       ///
   554       /// This operator increments the iterator, i.e. assigns it to the
   555       /// next arc incoming to or outgoing from the given node.
   556       GraphIncIt& operator++() { return *this; }
   557 
   558       /// \brief Equality operator
   559       ///
   560       /// Equality operator.
   561       /// Two iterators are equal if and only if they point to the
   562       /// same object or both are invalid.
   563       bool operator==(const GraphIncIt&) const { return true;}
   564 
   565       /// \brief Inequality operator
   566       ///
   567       /// Inequality operator.
   568       /// Two iterators are equal if and only if they point to the
   569       /// same object or both are invalid.
   570       bool operator!=(const GraphIncIt&) const { return true;}
   571 
   572       template <typename _GraphIncIt>
   573       struct Constraints {
   574         void constraints() {
   575           checkConcept<GraphItem<sel>, _GraphIncIt>();
   576           _GraphIncIt it1(graph, node);
   577           _GraphIncIt it2;
   578           _GraphIncIt it3 = it1;
   579           _GraphIncIt it4 = INVALID;
   580 
   581           it2 = ++it1;
   582           ++it2 = it1;
   583           ++(++it1);
   584           Item e = it1;
   585           e = it2;
   586         }
   587         const Base& node;
   588         const GR& graph;
   589       };
   590     };
   591 
   592     /// \brief Skeleton class for iterable directed graphs.
   593     ///
   594     /// This class describes the interface of iterable directed
   595     /// graphs. It extends \ref BaseDigraphComponent with the core
   596     /// iterable interface.
   597     /// This concept is part of the Digraph concept.
   598     template <typename BAS = BaseDigraphComponent>
   599     class IterableDigraphComponent : public BAS {
   600 
   601     public:
   602 
   603       typedef BAS Base;
   604       typedef typename Base::Node Node;
   605       typedef typename Base::Arc Arc;
   606 
   607       typedef IterableDigraphComponent Digraph;
   608 
   609       /// \name Base Iteration
   610       ///
   611       /// This interface provides functions for iteration on digraph items.
   612       ///
   613       /// @{
   614 
   615       /// \brief Return the first node.
   616       ///
   617       /// This function gives back the first node in the iteration order.
   618       void first(Node&) const {}
   619 
   620       /// \brief Return the next node.
   621       ///
   622       /// This function gives back the next node in the iteration order.
   623       void next(Node&) const {}
   624 
   625       /// \brief Return the first arc.
   626       ///
   627       /// This function gives back the first arc in the iteration order.
   628       void first(Arc&) const {}
   629 
   630       /// \brief Return the next arc.
   631       ///
   632       /// This function gives back the next arc in the iteration order.
   633       void next(Arc&) const {}
   634 
   635       /// \brief Return the first arc incomming to the given node.
   636       ///
   637       /// This function gives back the first arc incomming to the
   638       /// given node.
   639       void firstIn(Arc&, const Node&) const {}
   640 
   641       /// \brief Return the next arc incomming to the given node.
   642       ///
   643       /// This function gives back the next arc incomming to the
   644       /// given node.
   645       void nextIn(Arc&) const {}
   646 
   647       /// \brief Return the first arc outgoing form the given node.
   648       ///
   649       /// This function gives back the first arc outgoing form the
   650       /// given node.
   651       void firstOut(Arc&, const Node&) const {}
   652 
   653       /// \brief Return the next arc outgoing form the given node.
   654       ///
   655       /// This function gives back the next arc outgoing form the
   656       /// given node.
   657       void nextOut(Arc&) const {}
   658 
   659       /// @}
   660 
   661       /// \name Class Based Iteration
   662       ///
   663       /// This interface provides iterator classes for digraph items.
   664       ///
   665       /// @{
   666 
   667       /// \brief This iterator goes through each node.
   668       ///
   669       /// This iterator goes through each node.
   670       ///
   671       typedef GraphItemIt<Digraph, Node> NodeIt;
   672 
   673       /// \brief This iterator goes through each arc.
   674       ///
   675       /// This iterator goes through each arc.
   676       ///
   677       typedef GraphItemIt<Digraph, Arc> ArcIt;
   678 
   679       /// \brief This iterator goes trough the incoming arcs of a node.
   680       ///
   681       /// This iterator goes trough the \e incoming arcs of a certain node
   682       /// of a digraph.
   683       typedef GraphIncIt<Digraph, Arc, Node, 'i'> InArcIt;
   684 
   685       /// \brief This iterator goes trough the outgoing arcs of a node.
   686       ///
   687       /// This iterator goes trough the \e outgoing arcs of a certain node
   688       /// of a digraph.
   689       typedef GraphIncIt<Digraph, Arc, Node, 'o'> OutArcIt;
   690 
   691       /// \brief The base node of the iterator.
   692       ///
   693       /// This function gives back the base node of the iterator.
   694       /// It is always the target node of the pointed arc.
   695       Node baseNode(const InArcIt&) const { return INVALID; }
   696 
   697       /// \brief The running node of the iterator.
   698       ///
   699       /// This function gives back the running node of the iterator.
   700       /// It is always the source node of the pointed arc.
   701       Node runningNode(const InArcIt&) const { return INVALID; }
   702 
   703       /// \brief The base node of the iterator.
   704       ///
   705       /// This function gives back the base node of the iterator.
   706       /// It is always the source node of the pointed arc.
   707       Node baseNode(const OutArcIt&) const { return INVALID; }
   708 
   709       /// \brief The running node of the iterator.
   710       ///
   711       /// This function gives back the running node of the iterator.
   712       /// It is always the target node of the pointed arc.
   713       Node runningNode(const OutArcIt&) const { return INVALID; }
   714 
   715       /// @}
   716 
   717       template <typename _Digraph>
   718       struct Constraints {
   719         void constraints() {
   720           checkConcept<Base, _Digraph>();
   721 
   722           {
   723             typename _Digraph::Node node(INVALID);
   724             typename _Digraph::Arc arc(INVALID);
   725             {
   726               digraph.first(node);
   727               digraph.next(node);
   728             }
   729             {
   730               digraph.first(arc);
   731               digraph.next(arc);
   732             }
   733             {
   734               digraph.firstIn(arc, node);
   735               digraph.nextIn(arc);
   736             }
   737             {
   738               digraph.firstOut(arc, node);
   739               digraph.nextOut(arc);
   740             }
   741           }
   742 
   743           {
   744             checkConcept<GraphItemIt<_Digraph, typename _Digraph::Arc>,
   745               typename _Digraph::ArcIt >();
   746             checkConcept<GraphItemIt<_Digraph, typename _Digraph::Node>,
   747               typename _Digraph::NodeIt >();
   748             checkConcept<GraphIncIt<_Digraph, typename _Digraph::Arc,
   749               typename _Digraph::Node, 'i'>, typename _Digraph::InArcIt>();
   750             checkConcept<GraphIncIt<_Digraph, typename _Digraph::Arc,
   751               typename _Digraph::Node, 'o'>, typename _Digraph::OutArcIt>();
   752 
   753             typename _Digraph::Node n;
   754             const typename _Digraph::InArcIt iait(INVALID);
   755             const typename _Digraph::OutArcIt oait(INVALID);
   756             n = digraph.baseNode(iait);
   757             n = digraph.runningNode(iait);
   758             n = digraph.baseNode(oait);
   759             n = digraph.runningNode(oait);
   760             ignore_unused_variable_warning(n);
   761           }
   762         }
   763 
   764         const _Digraph& digraph;
   765       };
   766     };
   767 
   768     /// \brief Skeleton class for iterable undirected graphs.
   769     ///
   770     /// This class describes the interface of iterable undirected
   771     /// graphs. It extends \ref IterableDigraphComponent with the core
   772     /// iterable interface of undirected graphs.
   773     /// This concept is part of the Graph concept.
   774     template <typename BAS = BaseGraphComponent>
   775     class IterableGraphComponent : public IterableDigraphComponent<BAS> {
   776     public:
   777 
   778       typedef BAS Base;
   779       typedef typename Base::Node Node;
   780       typedef typename Base::Arc Arc;
   781       typedef typename Base::Edge Edge;
   782 
   783 
   784       typedef IterableGraphComponent Graph;
   785 
   786       /// \name Base Iteration
   787       ///
   788       /// This interface provides functions for iteration on edges.
   789       ///
   790       /// @{
   791 
   792       using IterableDigraphComponent<Base>::first;
   793       using IterableDigraphComponent<Base>::next;
   794 
   795       /// \brief Return the first edge.
   796       ///
   797       /// This function gives back the first edge in the iteration order.
   798       void first(Edge&) const {}
   799 
   800       /// \brief Return the next edge.
   801       ///
   802       /// This function gives back the next edge in the iteration order.
   803       void next(Edge&) const {}
   804 
   805       /// \brief Return the first edge incident to the given node.
   806       ///
   807       /// This function gives back the first edge incident to the given 
   808       /// node. The bool parameter gives back the direction for which the
   809       /// source node of the directed arc representing the edge is the 
   810       /// given node.
   811       void firstInc(Edge&, bool&, const Node&) const {}
   812 
   813       /// \brief Gives back the next of the edges from the
   814       /// given node.
   815       ///
   816       /// This function gives back the next edge incident to the given 
   817       /// node. The bool parameter should be used as \c firstInc() use it.
   818       void nextInc(Edge&, bool&) const {}
   819 
   820       using IterableDigraphComponent<Base>::baseNode;
   821       using IterableDigraphComponent<Base>::runningNode;
   822 
   823       /// @}
   824 
   825       /// \name Class Based Iteration
   826       ///
   827       /// This interface provides iterator classes for edges.
   828       ///
   829       /// @{
   830 
   831       /// \brief This iterator goes through each edge.
   832       ///
   833       /// This iterator goes through each edge.
   834       typedef GraphItemIt<Graph, Edge> EdgeIt;
   835 
   836       /// \brief This iterator goes trough the incident edges of a
   837       /// node.
   838       ///
   839       /// This iterator goes trough the incident edges of a certain
   840       /// node of a graph.
   841       typedef GraphIncIt<Graph, Edge, Node, 'e'> IncEdgeIt;
   842 
   843       /// \brief The base node of the iterator.
   844       ///
   845       /// This function gives back the base node of the iterator.
   846       Node baseNode(const IncEdgeIt&) const { return INVALID; }
   847 
   848       /// \brief The running node of the iterator.
   849       ///
   850       /// This function gives back the running node of the iterator.
   851       Node runningNode(const IncEdgeIt&) const { return INVALID; }
   852 
   853       /// @}
   854 
   855       template <typename _Graph>
   856       struct Constraints {
   857         void constraints() {
   858           checkConcept<IterableDigraphComponent<Base>, _Graph>();
   859 
   860           {
   861             typename _Graph::Node node(INVALID);
   862             typename _Graph::Edge edge(INVALID);
   863             bool dir;
   864             {
   865               graph.first(edge);
   866               graph.next(edge);
   867             }
   868             {
   869               graph.firstInc(edge, dir, node);
   870               graph.nextInc(edge, dir);
   871             }
   872 
   873           }
   874 
   875           {
   876             checkConcept<GraphItemIt<_Graph, typename _Graph::Edge>,
   877               typename _Graph::EdgeIt >();
   878             checkConcept<GraphIncIt<_Graph, typename _Graph::Edge,
   879               typename _Graph::Node, 'e'>, typename _Graph::IncEdgeIt>();
   880 
   881             typename _Graph::Node n;
   882             const typename _Graph::IncEdgeIt ieit(INVALID);
   883             n = graph.baseNode(ieit);
   884             n = graph.runningNode(ieit);
   885           }
   886         }
   887 
   888         const _Graph& graph;
   889       };
   890     };
   891 
   892     /// \brief Skeleton class for alterable directed graphs.
   893     ///
   894     /// This class describes the interface of alterable directed
   895     /// graphs. It extends \ref BaseDigraphComponent with the alteration
   896     /// notifier interface. It implements
   897     /// an observer-notifier pattern for each digraph item. More
   898     /// obsevers can be registered into the notifier and whenever an
   899     /// alteration occured in the digraph all the observers will be
   900     /// notified about it.
   901     template <typename BAS = BaseDigraphComponent>
   902     class AlterableDigraphComponent : public BAS {
   903     public:
   904 
   905       typedef BAS Base;
   906       typedef typename Base::Node Node;
   907       typedef typename Base::Arc Arc;
   908 
   909 
   910       /// Node alteration notifier class.
   911       typedef AlterationNotifier<AlterableDigraphComponent, Node>
   912       NodeNotifier;
   913       /// Arc alteration notifier class.
   914       typedef AlterationNotifier<AlterableDigraphComponent, Arc>
   915       ArcNotifier;
   916 
   917       /// \brief Return the node alteration notifier.
   918       ///
   919       /// This function gives back the node alteration notifier.
   920       NodeNotifier& notifier(Node) const {
   921          return NodeNotifier();
   922       }
   923 
   924       /// \brief Return the arc alteration notifier.
   925       ///
   926       /// This function gives back the arc alteration notifier.
   927       ArcNotifier& notifier(Arc) const {
   928         return ArcNotifier();
   929       }
   930 
   931       template <typename _Digraph>
   932       struct Constraints {
   933         void constraints() {
   934           checkConcept<Base, _Digraph>();
   935           typename _Digraph::NodeNotifier& nn
   936             = digraph.notifier(typename _Digraph::Node());
   937 
   938           typename _Digraph::ArcNotifier& en
   939             = digraph.notifier(typename _Digraph::Arc());
   940 
   941           ignore_unused_variable_warning(nn);
   942           ignore_unused_variable_warning(en);
   943         }
   944 
   945         const _Digraph& digraph;
   946       };
   947     };
   948 
   949     /// \brief Skeleton class for alterable undirected graphs.
   950     ///
   951     /// This class describes the interface of alterable undirected
   952     /// graphs. It extends \ref AlterableDigraphComponent with the alteration
   953     /// notifier interface of undirected graphs. It implements
   954     /// an observer-notifier pattern for the edges. More
   955     /// obsevers can be registered into the notifier and whenever an
   956     /// alteration occured in the graph all the observers will be
   957     /// notified about it.
   958     template <typename BAS = BaseGraphComponent>
   959     class AlterableGraphComponent : public AlterableDigraphComponent<BAS> {
   960     public:
   961 
   962       typedef BAS Base;
   963       typedef typename Base::Edge Edge;
   964 
   965 
   966       /// Edge alteration notifier class.
   967       typedef AlterationNotifier<AlterableGraphComponent, Edge>
   968       EdgeNotifier;
   969 
   970       /// \brief Return the edge alteration notifier.
   971       ///
   972       /// This function gives back the edge alteration notifier.
   973       EdgeNotifier& notifier(Edge) const {
   974         return EdgeNotifier();
   975       }
   976 
   977       template <typename _Graph>
   978       struct Constraints {
   979         void constraints() {
   980           checkConcept<AlterableDigraphComponent<Base>, _Graph>();
   981           typename _Graph::EdgeNotifier& uen
   982             = graph.notifier(typename _Graph::Edge());
   983           ignore_unused_variable_warning(uen);
   984         }
   985 
   986         const _Graph& graph;
   987       };
   988     };
   989 
   990     /// \brief Concept class for standard graph maps.
   991     ///
   992     /// This class describes the concept of standard graph maps, i.e.
   993     /// the \c NodeMap, \c ArcMap and \c EdgeMap subtypes of digraph and 
   994     /// graph types, which can be used for associating data to graph items.
   995     /// The standard graph maps must conform to the ReferenceMap concept.
   996     template <typename GR, typename K, typename V>
   997     class GraphMap : public ReferenceMap<K, V, V&, const V&> {
   998       typedef ReferenceMap<K, V, V&, const V&> Parent;
   999 
  1000     public:
  1001 
  1002       /// The key type of the map.
  1003       typedef K Key;
  1004       /// The value type of the map.
  1005       typedef V Value;
  1006       /// The reference type of the map.
  1007       typedef Value& Reference;
  1008       /// The const reference type of the map.
  1009       typedef const Value& ConstReference;
  1010 
  1011       // The reference map tag.
  1012       typedef True ReferenceMapTag;
  1013 
  1014       /// \brief Construct a new map.
  1015       ///
  1016       /// Construct a new map for the graph.
  1017       explicit GraphMap(const GR&) {}
  1018       /// \brief Construct a new map with default value.
  1019       ///
  1020       /// Construct a new map for the graph and initalize the values.
  1021       GraphMap(const GR&, const Value&) {}
  1022 
  1023     private:
  1024       /// \brief Copy constructor.
  1025       ///
  1026       /// Copy Constructor.
  1027       GraphMap(const GraphMap&) : Parent() {}
  1028 
  1029       /// \brief Assignment operator.
  1030       ///
  1031       /// Assignment operator. It does not mofify the underlying graph,
  1032       /// it just iterates on the current item set and set the  map
  1033       /// with the value returned by the assigned map.
  1034       template <typename CMap>
  1035       GraphMap& operator=(const CMap&) {
  1036         checkConcept<ReadMap<Key, Value>, CMap>();
  1037         return *this;
  1038       }
  1039 
  1040     public:
  1041       template<typename _Map>
  1042       struct Constraints {
  1043         void constraints() {
  1044           checkConcept
  1045             <ReferenceMap<Key, Value, Value&, const Value&>, _Map>();
  1046           _Map m1(g);
  1047           _Map m2(g,t);
  1048           
  1049           // Copy constructor
  1050           // _Map m3(m);
  1051 
  1052           // Assignment operator
  1053           // ReadMap<Key, Value> cmap;
  1054           // m3 = cmap;
  1055 
  1056           ignore_unused_variable_warning(m1);
  1057           ignore_unused_variable_warning(m2);
  1058           // ignore_unused_variable_warning(m3);
  1059         }
  1060 
  1061         const _Map &m;
  1062         const GR &g;
  1063         const typename GraphMap::Value &t;
  1064       };
  1065 
  1066     };
  1067 
  1068     /// \brief Skeleton class for mappable directed graphs.
  1069     ///
  1070     /// This class describes the interface of mappable directed graphs.
  1071     /// It extends \ref BaseDigraphComponent with the standard digraph 
  1072     /// map classes, namely \c NodeMap and \c ArcMap.
  1073     /// This concept is part of the Digraph concept.
  1074     template <typename BAS = BaseDigraphComponent>
  1075     class MappableDigraphComponent : public BAS  {
  1076     public:
  1077 
  1078       typedef BAS Base;
  1079       typedef typename Base::Node Node;
  1080       typedef typename Base::Arc Arc;
  1081 
  1082       typedef MappableDigraphComponent Digraph;
  1083 
  1084       /// \brief Standard graph map for the nodes.
  1085       ///
  1086       /// Standard graph map for the nodes.
  1087       /// It conforms to the ReferenceMap concept.
  1088       template <typename V>
  1089       class NodeMap : public GraphMap<MappableDigraphComponent, Node, V> {
  1090         typedef GraphMap<MappableDigraphComponent, Node, V> Parent;
  1091 
  1092       public:
  1093         /// \brief Construct a new map.
  1094         ///
  1095         /// Construct a new map for the digraph.
  1096         explicit NodeMap(const MappableDigraphComponent& digraph)
  1097           : Parent(digraph) {}
  1098 
  1099         /// \brief Construct a new map with default value.
  1100         ///
  1101         /// Construct a new map for the digraph and initalize the values.
  1102         NodeMap(const MappableDigraphComponent& digraph, const V& value)
  1103           : Parent(digraph, value) {}
  1104 
  1105       private:
  1106         /// \brief Copy constructor.
  1107         ///
  1108         /// Copy Constructor.
  1109         NodeMap(const NodeMap& nm) : Parent(nm) {}
  1110 
  1111         /// \brief Assignment operator.
  1112         ///
  1113         /// Assignment operator.
  1114         template <typename CMap>
  1115         NodeMap& operator=(const CMap&) {
  1116           checkConcept<ReadMap<Node, V>, CMap>();
  1117           return *this;
  1118         }
  1119 
  1120       };
  1121 
  1122       /// \brief Standard graph map for the arcs.
  1123       ///
  1124       /// Standard graph map for the arcs.
  1125       /// It conforms to the ReferenceMap concept.
  1126       template <typename V>
  1127       class ArcMap : public GraphMap<MappableDigraphComponent, Arc, V> {
  1128         typedef GraphMap<MappableDigraphComponent, Arc, V> Parent;
  1129 
  1130       public:
  1131         /// \brief Construct a new map.
  1132         ///
  1133         /// Construct a new map for the digraph.
  1134         explicit ArcMap(const MappableDigraphComponent& digraph)
  1135           : Parent(digraph) {}
  1136 
  1137         /// \brief Construct a new map with default value.
  1138         ///
  1139         /// Construct a new map for the digraph and initalize the values.
  1140         ArcMap(const MappableDigraphComponent& digraph, const V& value)
  1141           : Parent(digraph, value) {}
  1142 
  1143       private:
  1144         /// \brief Copy constructor.
  1145         ///
  1146         /// Copy Constructor.
  1147         ArcMap(const ArcMap& nm) : Parent(nm) {}
  1148 
  1149         /// \brief Assignment operator.
  1150         ///
  1151         /// Assignment operator.
  1152         template <typename CMap>
  1153         ArcMap& operator=(const CMap&) {
  1154           checkConcept<ReadMap<Arc, V>, CMap>();
  1155           return *this;
  1156         }
  1157 
  1158       };
  1159 
  1160 
  1161       template <typename _Digraph>
  1162       struct Constraints {
  1163 
  1164         struct Dummy {
  1165           int value;
  1166           Dummy() : value(0) {}
  1167           Dummy(int _v) : value(_v) {}
  1168         };
  1169 
  1170         void constraints() {
  1171           checkConcept<Base, _Digraph>();
  1172           { // int map test
  1173             typedef typename _Digraph::template NodeMap<int> IntNodeMap;
  1174             checkConcept<GraphMap<_Digraph, typename _Digraph::Node, int>,
  1175               IntNodeMap >();
  1176           } { // bool map test
  1177             typedef typename _Digraph::template NodeMap<bool> BoolNodeMap;
  1178             checkConcept<GraphMap<_Digraph, typename _Digraph::Node, bool>,
  1179               BoolNodeMap >();
  1180           } { // Dummy map test
  1181             typedef typename _Digraph::template NodeMap<Dummy> DummyNodeMap;
  1182             checkConcept<GraphMap<_Digraph, typename _Digraph::Node, Dummy>,
  1183               DummyNodeMap >();
  1184           }
  1185 
  1186           { // int map test
  1187             typedef typename _Digraph::template ArcMap<int> IntArcMap;
  1188             checkConcept<GraphMap<_Digraph, typename _Digraph::Arc, int>,
  1189               IntArcMap >();
  1190           } { // bool map test
  1191             typedef typename _Digraph::template ArcMap<bool> BoolArcMap;
  1192             checkConcept<GraphMap<_Digraph, typename _Digraph::Arc, bool>,
  1193               BoolArcMap >();
  1194           } { // Dummy map test
  1195             typedef typename _Digraph::template ArcMap<Dummy> DummyArcMap;
  1196             checkConcept<GraphMap<_Digraph, typename _Digraph::Arc, Dummy>,
  1197               DummyArcMap >();
  1198           }
  1199         }
  1200 
  1201         const _Digraph& digraph;
  1202       };
  1203     };
  1204 
  1205     /// \brief Skeleton class for mappable undirected graphs.
  1206     ///
  1207     /// This class describes the interface of mappable undirected graphs.
  1208     /// It extends \ref MappableDigraphComponent with the standard graph 
  1209     /// map class for edges (\c EdgeMap).
  1210     /// This concept is part of the Graph concept.
  1211     template <typename BAS = BaseGraphComponent>
  1212     class MappableGraphComponent : public MappableDigraphComponent<BAS>  {
  1213     public:
  1214 
  1215       typedef BAS Base;
  1216       typedef typename Base::Edge Edge;
  1217 
  1218       typedef MappableGraphComponent Graph;
  1219 
  1220       /// \brief Standard graph map for the edges.
  1221       ///
  1222       /// Standard graph map for the edges.
  1223       /// It conforms to the ReferenceMap concept.
  1224       template <typename V>
  1225       class EdgeMap : public GraphMap<MappableGraphComponent, Edge, V> {
  1226         typedef GraphMap<MappableGraphComponent, Edge, V> Parent;
  1227 
  1228       public:
  1229         /// \brief Construct a new map.
  1230         ///
  1231         /// Construct a new map for the graph.
  1232         explicit EdgeMap(const MappableGraphComponent& graph)
  1233           : Parent(graph) {}
  1234 
  1235         /// \brief Construct a new map with default value.
  1236         ///
  1237         /// Construct a new map for the graph and initalize the values.
  1238         EdgeMap(const MappableGraphComponent& graph, const V& value)
  1239           : Parent(graph, value) {}
  1240 
  1241       private:
  1242         /// \brief Copy constructor.
  1243         ///
  1244         /// Copy Constructor.
  1245         EdgeMap(const EdgeMap& nm) : Parent(nm) {}
  1246 
  1247         /// \brief Assignment operator.
  1248         ///
  1249         /// Assignment operator.
  1250         template <typename CMap>
  1251         EdgeMap& operator=(const CMap&) {
  1252           checkConcept<ReadMap<Edge, V>, CMap>();
  1253           return *this;
  1254         }
  1255 
  1256       };
  1257 
  1258 
  1259       template <typename _Graph>
  1260       struct Constraints {
  1261 
  1262         struct Dummy {
  1263           int value;
  1264           Dummy() : value(0) {}
  1265           Dummy(int _v) : value(_v) {}
  1266         };
  1267 
  1268         void constraints() {
  1269           checkConcept<MappableDigraphComponent<Base>, _Graph>();
  1270 
  1271           { // int map test
  1272             typedef typename _Graph::template EdgeMap<int> IntEdgeMap;
  1273             checkConcept<GraphMap<_Graph, typename _Graph::Edge, int>,
  1274               IntEdgeMap >();
  1275           } { // bool map test
  1276             typedef typename _Graph::template EdgeMap<bool> BoolEdgeMap;
  1277             checkConcept<GraphMap<_Graph, typename _Graph::Edge, bool>,
  1278               BoolEdgeMap >();
  1279           } { // Dummy map test
  1280             typedef typename _Graph::template EdgeMap<Dummy> DummyEdgeMap;
  1281             checkConcept<GraphMap<_Graph, typename _Graph::Edge, Dummy>,
  1282               DummyEdgeMap >();
  1283           }
  1284         }
  1285 
  1286         const _Graph& graph;
  1287       };
  1288     };
  1289 
  1290     /// \brief Skeleton class for extendable directed graphs.
  1291     ///
  1292     /// This class describes the interface of extendable directed graphs.
  1293     /// It extends \ref BaseDigraphComponent with functions for adding 
  1294     /// nodes and arcs to the digraph.
  1295     /// This concept requires \ref AlterableDigraphComponent.
  1296     template <typename BAS = BaseDigraphComponent>
  1297     class ExtendableDigraphComponent : public BAS {
  1298     public:
  1299       typedef BAS Base;
  1300 
  1301       typedef typename Base::Node Node;
  1302       typedef typename Base::Arc Arc;
  1303 
  1304       /// \brief Add a new node to the digraph.
  1305       ///
  1306       /// This function adds a new node to the digraph.
  1307       Node addNode() {
  1308         return INVALID;
  1309       }
  1310 
  1311       /// \brief Add a new arc connecting the given two nodes.
  1312       ///
  1313       /// This function adds a new arc connecting the given two nodes
  1314       /// of the digraph.
  1315       Arc addArc(const Node&, const Node&) {
  1316         return INVALID;
  1317       }
  1318 
  1319       template <typename _Digraph>
  1320       struct Constraints {
  1321         void constraints() {
  1322           checkConcept<Base, _Digraph>();
  1323           typename _Digraph::Node node_a, node_b;
  1324           node_a = digraph.addNode();
  1325           node_b = digraph.addNode();
  1326           typename _Digraph::Arc arc;
  1327           arc = digraph.addArc(node_a, node_b);
  1328         }
  1329 
  1330         _Digraph& digraph;
  1331       };
  1332     };
  1333 
  1334     /// \brief Skeleton class for extendable undirected graphs.
  1335     ///
  1336     /// This class describes the interface of extendable undirected graphs.
  1337     /// It extends \ref BaseGraphComponent with functions for adding 
  1338     /// nodes and edges to the graph.
  1339     /// This concept requires \ref AlterableGraphComponent.
  1340     template <typename BAS = BaseGraphComponent>
  1341     class ExtendableGraphComponent : public BAS {
  1342     public:
  1343 
  1344       typedef BAS Base;
  1345       typedef typename Base::Node Node;
  1346       typedef typename Base::Edge Edge;
  1347 
  1348       /// \brief Add a new node to the digraph.
  1349       ///
  1350       /// This function adds a new node to the digraph.
  1351       Node addNode() {
  1352         return INVALID;
  1353       }
  1354 
  1355       /// \brief Add a new edge connecting the given two nodes.
  1356       ///
  1357       /// This function adds a new edge connecting the given two nodes
  1358       /// of the graph.
  1359       Edge addEdge(const Node&, const Node&) {
  1360         return INVALID;
  1361       }
  1362 
  1363       template <typename _Graph>
  1364       struct Constraints {
  1365         void constraints() {
  1366           checkConcept<Base, _Graph>();
  1367           typename _Graph::Node node_a, node_b;
  1368           node_a = graph.addNode();
  1369           node_b = graph.addNode();
  1370           typename _Graph::Edge edge;
  1371           edge = graph.addEdge(node_a, node_b);
  1372         }
  1373 
  1374         _Graph& graph;
  1375       };
  1376     };
  1377 
  1378     /// \brief Skeleton class for erasable directed graphs.
  1379     ///
  1380     /// This class describes the interface of erasable directed graphs.
  1381     /// It extends \ref BaseDigraphComponent with functions for removing 
  1382     /// nodes and arcs from the digraph.
  1383     /// This concept requires \ref AlterableDigraphComponent.
  1384     template <typename BAS = BaseDigraphComponent>
  1385     class ErasableDigraphComponent : public BAS {
  1386     public:
  1387 
  1388       typedef BAS Base;
  1389       typedef typename Base::Node Node;
  1390       typedef typename Base::Arc Arc;
  1391 
  1392       /// \brief Erase a node from the digraph.
  1393       ///
  1394       /// This function erases the given node from the digraph and all arcs 
  1395       /// connected to the node.
  1396       void erase(const Node&) {}
  1397 
  1398       /// \brief Erase an arc from the digraph.
  1399       ///
  1400       /// This function erases the given arc from the digraph.
  1401       void erase(const Arc&) {}
  1402 
  1403       template <typename _Digraph>
  1404       struct Constraints {
  1405         void constraints() {
  1406           checkConcept<Base, _Digraph>();
  1407           const typename _Digraph::Node node(INVALID);
  1408           digraph.erase(node);
  1409           const typename _Digraph::Arc arc(INVALID);
  1410           digraph.erase(arc);
  1411         }
  1412 
  1413         _Digraph& digraph;
  1414       };
  1415     };
  1416 
  1417     /// \brief Skeleton class for erasable undirected graphs.
  1418     ///
  1419     /// This class describes the interface of erasable undirected graphs.
  1420     /// It extends \ref BaseGraphComponent with functions for removing 
  1421     /// nodes and edges from the graph.
  1422     /// This concept requires \ref AlterableGraphComponent.
  1423     template <typename BAS = BaseGraphComponent>
  1424     class ErasableGraphComponent : public BAS {
  1425     public:
  1426 
  1427       typedef BAS Base;
  1428       typedef typename Base::Node Node;
  1429       typedef typename Base::Edge Edge;
  1430 
  1431       /// \brief Erase a node from the graph.
  1432       ///
  1433       /// This function erases the given node from the graph and all edges
  1434       /// connected to the node.
  1435       void erase(const Node&) {}
  1436 
  1437       /// \brief Erase an edge from the digraph.
  1438       ///
  1439       /// This function erases the given edge from the digraph.
  1440       void erase(const Edge&) {}
  1441 
  1442       template <typename _Graph>
  1443       struct Constraints {
  1444         void constraints() {
  1445           checkConcept<Base, _Graph>();
  1446           const typename _Graph::Node node(INVALID);
  1447           graph.erase(node);
  1448           const typename _Graph::Edge edge(INVALID);
  1449           graph.erase(edge);
  1450         }
  1451 
  1452         _Graph& graph;
  1453       };
  1454     };
  1455 
  1456     /// \brief Skeleton class for clearable directed graphs.
  1457     ///
  1458     /// This class describes the interface of clearable directed graphs.
  1459     /// It extends \ref BaseDigraphComponent with a function for clearing
  1460     /// the digraph.
  1461     /// This concept requires \ref AlterableDigraphComponent.
  1462     template <typename BAS = BaseDigraphComponent>
  1463     class ClearableDigraphComponent : public BAS {
  1464     public:
  1465 
  1466       typedef BAS Base;
  1467 
  1468       /// \brief Erase all nodes and arcs from the digraph.
  1469       ///
  1470       /// This function erases all nodes and arcs from the digraph.
  1471       void clear() {}
  1472 
  1473       template <typename _Digraph>
  1474       struct Constraints {
  1475         void constraints() {
  1476           checkConcept<Base, _Digraph>();
  1477           digraph.clear();
  1478         }
  1479 
  1480         _Digraph& digraph;
  1481       };
  1482     };
  1483 
  1484     /// \brief Skeleton class for clearable undirected graphs.
  1485     ///
  1486     /// This class describes the interface of clearable undirected graphs.
  1487     /// It extends \ref BaseGraphComponent with a function for clearing
  1488     /// the graph.
  1489     /// This concept requires \ref AlterableGraphComponent.
  1490     template <typename BAS = BaseGraphComponent>
  1491     class ClearableGraphComponent : public ClearableDigraphComponent<BAS> {
  1492     public:
  1493 
  1494       typedef BAS Base;
  1495 
  1496       /// \brief Erase all nodes and edges from the graph.
  1497       ///
  1498       /// This function erases all nodes and edges from the graph.
  1499       void clear() {}
  1500 
  1501       template <typename _Graph>
  1502       struct Constraints {
  1503         void constraints() {
  1504           checkConcept<Base, _Graph>();
  1505           graph.clear();
  1506         }
  1507 
  1508         _Graph& graph;
  1509       };
  1510     };
  1511 
  1512   }
  1513 
  1514 }
  1515 
  1516 #endif