lemon/concepts/bpgraph.h
author Balazs Dezso <deba@inf.elte.hu>
Sun, 14 Nov 2010 16:35:31 +0100
changeset 1186 2e959a5a0c2d
child 1193 c8fa41fcc4a7
permissions -rw-r--r--
Add bipartite graph concepts (#69)
     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-2010
     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 concept of undirected graphs.
    22 
    23 #ifndef LEMON_CONCEPTS_BPGRAPH_H
    24 #define LEMON_CONCEPTS_BPGRAPH_H
    25 
    26 #include <lemon/concepts/graph_components.h>
    27 #include <lemon/concepts/maps.h>
    28 #include <lemon/concept_check.h>
    29 #include <lemon/core.h>
    30 
    31 namespace lemon {
    32   namespace concepts {
    33 
    34     /// \ingroup graph_concepts
    35     ///
    36     /// \brief Class describing the concept of undirected bipartite graphs.
    37     ///
    38     /// This class describes the common interface of all undirected
    39     /// bipartite graphs.
    40     ///
    41     /// Like all concept classes, it only provides an interface
    42     /// without any sensible implementation. So any general algorithm for
    43     /// undirected bipartite graphs should compile with this class,
    44     /// but it will not run properly, of course.
    45     /// An actual graph implementation like \ref ListBpGraph or
    46     /// \ref SmartBpGraph may have additional functionality.
    47     ///
    48     /// The bipartite graphs also fulfill the concept of \ref Graph
    49     /// "undirected graphs". Bipartite graphs provide a bipartition of
    50     /// the node set, namely a red and blue set of the nodes. The
    51     /// nodes can be iterated with the RedIt and BlueIt in the two
    52     /// node sets. With RedMap and BlueMap values can be assigned to
    53     /// the nodes in the two sets.
    54     ///
    55     /// The edges of the graph cannot connect two nodes of the same
    56     /// set. The edges inherent orientation is from the red nodes to
    57     /// the blue nodes.
    58     ///
    59     /// \sa Graph
    60     class BpGraph {
    61     private:
    62       /// BpGraphs are \e not copy constructible. Use bpGraphCopy instead.
    63       BpGraph(const BpGraph&) {}
    64       /// \brief Assignment of a graph to another one is \e not allowed.
    65       /// Use bpGraphCopy instead.
    66       void operator=(const BpGraph&) {}
    67 
    68     public:
    69       /// Default constructor.
    70       BpGraph() {}
    71 
    72       /// \brief Undirected graphs should be tagged with \c UndirectedTag.
    73       ///
    74       /// Undirected graphs should be tagged with \c UndirectedTag.
    75       ///
    76       /// This tag helps the \c enable_if technics to make compile time
    77       /// specializations for undirected graphs.
    78       typedef True UndirectedTag;
    79 
    80       /// The node type of the graph
    81 
    82       /// This class identifies a node of the graph. It also serves
    83       /// as a base class of the node iterators,
    84       /// thus they convert to this type.
    85       class Node {
    86       public:
    87         /// Default constructor
    88 
    89         /// Default constructor.
    90         /// \warning It sets the object to an undefined value.
    91         Node() { }
    92         /// Copy constructor.
    93 
    94         /// Copy constructor.
    95         ///
    96         Node(const Node&) { }
    97 
    98         /// %Invalid constructor \& conversion.
    99 
   100         /// Initializes the object to be invalid.
   101         /// \sa Invalid for more details.
   102         Node(Invalid) { }
   103         /// Equality operator
   104 
   105         /// Equality operator.
   106         ///
   107         /// Two iterators are equal if and only if they point to the
   108         /// same object or both are \c INVALID.
   109         bool operator==(Node) const { return true; }
   110 
   111         /// Inequality operator
   112 
   113         /// Inequality operator.
   114         bool operator!=(Node) const { return true; }
   115 
   116         /// Artificial ordering operator.
   117 
   118         /// Artificial ordering operator.
   119         ///
   120         /// \note This operator only has to define some strict ordering of
   121         /// the items; this order has nothing to do with the iteration
   122         /// ordering of the items.
   123         bool operator<(Node) const { return false; }
   124 
   125       };
   126 
   127       /// Class to represent red nodes.
   128 
   129       /// This class represents the red nodes of the graph. It does
   130       /// not supposed to be used directly, because the nodes can be
   131       /// represented as Node instances. This class can be used as
   132       /// template parameter for special map classes.
   133       class RedNode : public Node {
   134       public:
   135         /// Default constructor
   136 
   137         /// Default constructor.
   138         /// \warning It sets the object to an undefined value.
   139         RedNode() { }
   140         /// Copy constructor.
   141 
   142         /// Copy constructor.
   143         ///
   144         RedNode(const RedNode&) : Node() { }
   145 
   146         /// %Invalid constructor \& conversion.
   147 
   148         /// Initializes the object to be invalid.
   149         /// \sa Invalid for more details.
   150         RedNode(Invalid) { }
   151 
   152         /// Constructor for conversion from a node.
   153 
   154         /// Constructor for conversion from a node. The conversion can
   155         /// be invalid, since the Node can be member of the blue
   156         /// set.
   157         RedNode(const Node&) {}
   158       };
   159 
   160       /// Class to represent blue nodes.
   161 
   162       /// This class represents the blue nodes of the graph. It does
   163       /// not supposed to be used directly, because the nodes can be
   164       /// represented as Node instances. This class can be used as
   165       /// template parameter for special map classes.
   166       class BlueNode : public Node {
   167       public:
   168         /// Default constructor
   169 
   170         /// Default constructor.
   171         /// \warning It sets the object to an undefined value.
   172         BlueNode() { }
   173         /// Copy constructor.
   174 
   175         /// Copy constructor.
   176         ///
   177         BlueNode(const BlueNode&) : Node() { }
   178 
   179         /// %Invalid constructor \& conversion.
   180 
   181         /// Initializes the object to be invalid.
   182         /// \sa Invalid for more details.
   183         BlueNode(Invalid) { }
   184 
   185         /// Constructor for conversion from a node.
   186 
   187         /// Constructor for conversion from a node. The conversion can
   188         /// be invalid, since the Node can be member of the red
   189         /// set.
   190         BlueNode(const Node&) {}
   191       };
   192 
   193       /// Iterator class for the red nodes.
   194 
   195       /// This iterator goes through each red node of the graph.
   196       /// Its usage is quite simple, for example, you can count the number
   197       /// of red nodes in a graph \c g of type \c %BpGraph like this:
   198       ///\code
   199       /// int count=0;
   200       /// for (BpGraph::RedNodeIt n(g); n!=INVALID; ++n) ++count;
   201       ///\endcode
   202       class RedIt : public Node {
   203       public:
   204         /// Default constructor
   205 
   206         /// Default constructor.
   207         /// \warning It sets the iterator to an undefined value.
   208         RedIt() { }
   209         /// Copy constructor.
   210 
   211         /// Copy constructor.
   212         ///
   213         RedIt(const RedIt& n) : Node(n) { }
   214         /// %Invalid constructor \& conversion.
   215 
   216         /// Initializes the iterator to be invalid.
   217         /// \sa Invalid for more details.
   218         RedIt(Invalid) { }
   219         /// Sets the iterator to the first red node.
   220 
   221         /// Sets the iterator to the first red node of the given
   222         /// digraph.
   223         explicit RedIt(const BpGraph&) { }
   224         /// Sets the iterator to the given red node.
   225 
   226         /// Sets the iterator to the given red node of the given
   227         /// digraph.
   228         RedIt(const BpGraph&, const Node&) { }
   229         /// Next node.
   230 
   231         /// Assign the iterator to the next red node.
   232         ///
   233         RedIt& operator++() { return *this; }
   234       };
   235 
   236       /// Iterator class for the blue nodes.
   237 
   238       /// This iterator goes through each blue node of the graph.
   239       /// Its usage is quite simple, for example, you can count the number
   240       /// of blue nodes in a graph \c g of type \c %BpGraph like this:
   241       ///\code
   242       /// int count=0;
   243       /// for (BpGraph::BlueNodeIt n(g); n!=INVALID; ++n) ++count;
   244       ///\endcode
   245       class BlueIt : public Node {
   246       public:
   247         /// Default constructor
   248 
   249         /// Default constructor.
   250         /// \warning It sets the iterator to an undefined value.
   251         BlueIt() { }
   252         /// Copy constructor.
   253 
   254         /// Copy constructor.
   255         ///
   256         BlueIt(const BlueIt& n) : Node(n) { }
   257         /// %Invalid constructor \& conversion.
   258 
   259         /// Initializes the iterator to be invalid.
   260         /// \sa Invalid for more details.
   261         BlueIt(Invalid) { }
   262         /// Sets the iterator to the first blue node.
   263 
   264         /// Sets the iterator to the first blue node of the given
   265         /// digraph.
   266         explicit BlueIt(const BpGraph&) { }
   267         /// Sets the iterator to the given blue node.
   268 
   269         /// Sets the iterator to the given blue node of the given
   270         /// digraph.
   271         BlueIt(const BpGraph&, const Node&) { }
   272         /// Next node.
   273 
   274         /// Assign the iterator to the next blue node.
   275         ///
   276         BlueIt& operator++() { return *this; }
   277       };
   278 
   279       /// Iterator class for the nodes.
   280 
   281       /// This iterator goes through each node of the graph.
   282       /// Its usage is quite simple, for example, you can count the number
   283       /// of nodes in a graph \c g of type \c %BpGraph like this:
   284       ///\code
   285       /// int count=0;
   286       /// for (BpGraph::NodeIt n(g); n!=INVALID; ++n) ++count;
   287       ///\endcode
   288       class NodeIt : public Node {
   289       public:
   290         /// Default constructor
   291 
   292         /// Default constructor.
   293         /// \warning It sets the iterator to an undefined value.
   294         NodeIt() { }
   295         /// Copy constructor.
   296 
   297         /// Copy constructor.
   298         ///
   299         NodeIt(const NodeIt& n) : Node(n) { }
   300         /// %Invalid constructor \& conversion.
   301 
   302         /// Initializes the iterator to be invalid.
   303         /// \sa Invalid for more details.
   304         NodeIt(Invalid) { }
   305         /// Sets the iterator to the first node.
   306 
   307         /// Sets the iterator to the first node of the given digraph.
   308         ///
   309         explicit NodeIt(const BpGraph&) { }
   310         /// Sets the iterator to the given node.
   311 
   312         /// Sets the iterator to the given node of the given digraph.
   313         ///
   314         NodeIt(const BpGraph&, const Node&) { }
   315         /// Next node.
   316 
   317         /// Assign the iterator to the next node.
   318         ///
   319         NodeIt& operator++() { return *this; }
   320       };
   321 
   322 
   323       /// The edge type of the graph
   324 
   325       /// This class identifies an edge of the graph. It also serves
   326       /// as a base class of the edge iterators,
   327       /// thus they will convert to this type.
   328       class Edge {
   329       public:
   330         /// Default constructor
   331 
   332         /// Default constructor.
   333         /// \warning It sets the object to an undefined value.
   334         Edge() { }
   335         /// Copy constructor.
   336 
   337         /// Copy constructor.
   338         ///
   339         Edge(const Edge&) { }
   340         /// %Invalid constructor \& conversion.
   341 
   342         /// Initializes the object to be invalid.
   343         /// \sa Invalid for more details.
   344         Edge(Invalid) { }
   345         /// Equality operator
   346 
   347         /// Equality operator.
   348         ///
   349         /// Two iterators are equal if and only if they point to the
   350         /// same object or both are \c INVALID.
   351         bool operator==(Edge) const { return true; }
   352         /// Inequality operator
   353 
   354         /// Inequality operator.
   355         bool operator!=(Edge) const { return true; }
   356 
   357         /// Artificial ordering operator.
   358 
   359         /// Artificial ordering operator.
   360         ///
   361         /// \note This operator only has to define some strict ordering of
   362         /// the edges; this order has nothing to do with the iteration
   363         /// ordering of the edges.
   364         bool operator<(Edge) const { return false; }
   365       };
   366 
   367       /// Iterator class for the edges.
   368 
   369       /// This iterator goes through each edge of the graph.
   370       /// Its usage is quite simple, for example, you can count the number
   371       /// of edges in a graph \c g of type \c %BpGraph as follows:
   372       ///\code
   373       /// int count=0;
   374       /// for(BpGraph::EdgeIt e(g); e!=INVALID; ++e) ++count;
   375       ///\endcode
   376       class EdgeIt : public Edge {
   377       public:
   378         /// Default constructor
   379 
   380         /// Default constructor.
   381         /// \warning It sets the iterator to an undefined value.
   382         EdgeIt() { }
   383         /// Copy constructor.
   384 
   385         /// Copy constructor.
   386         ///
   387         EdgeIt(const EdgeIt& e) : Edge(e) { }
   388         /// %Invalid constructor \& conversion.
   389 
   390         /// Initializes the iterator to be invalid.
   391         /// \sa Invalid for more details.
   392         EdgeIt(Invalid) { }
   393         /// Sets the iterator to the first edge.
   394 
   395         /// Sets the iterator to the first edge of the given graph.
   396         ///
   397         explicit EdgeIt(const BpGraph&) { }
   398         /// Sets the iterator to the given edge.
   399 
   400         /// Sets the iterator to the given edge of the given graph.
   401         ///
   402         EdgeIt(const BpGraph&, const Edge&) { }
   403         /// Next edge
   404 
   405         /// Assign the iterator to the next edge.
   406         ///
   407         EdgeIt& operator++() { return *this; }
   408       };
   409 
   410       /// Iterator class for the incident edges of a node.
   411 
   412       /// This iterator goes trough the incident undirected edges
   413       /// of a certain node of a graph.
   414       /// Its usage is quite simple, for example, you can compute the
   415       /// degree (i.e. the number of incident edges) of a node \c n
   416       /// in a graph \c g of type \c %BpGraph as follows.
   417       ///
   418       ///\code
   419       /// int count=0;
   420       /// for(BpGraph::IncEdgeIt e(g, n); e!=INVALID; ++e) ++count;
   421       ///\endcode
   422       ///
   423       /// \warning Loop edges will be iterated twice.
   424       class IncEdgeIt : public Edge {
   425       public:
   426         /// Default constructor
   427 
   428         /// Default constructor.
   429         /// \warning It sets the iterator to an undefined value.
   430         IncEdgeIt() { }
   431         /// Copy constructor.
   432 
   433         /// Copy constructor.
   434         ///
   435         IncEdgeIt(const IncEdgeIt& e) : Edge(e) { }
   436         /// %Invalid constructor \& conversion.
   437 
   438         /// Initializes the iterator to be invalid.
   439         /// \sa Invalid for more details.
   440         IncEdgeIt(Invalid) { }
   441         /// Sets the iterator to the first incident edge.
   442 
   443         /// Sets the iterator to the first incident edge of the given node.
   444         ///
   445         IncEdgeIt(const BpGraph&, const Node&) { }
   446         /// Sets the iterator to the given edge.
   447 
   448         /// Sets the iterator to the given edge of the given graph.
   449         ///
   450         IncEdgeIt(const BpGraph&, const Edge&) { }
   451         /// Next incident edge
   452 
   453         /// Assign the iterator to the next incident edge
   454         /// of the corresponding node.
   455         IncEdgeIt& operator++() { return *this; }
   456       };
   457 
   458       /// The arc type of the graph
   459 
   460       /// This class identifies a directed arc of the graph. It also serves
   461       /// as a base class of the arc iterators,
   462       /// thus they will convert to this type.
   463       class Arc {
   464       public:
   465         /// Default constructor
   466 
   467         /// Default constructor.
   468         /// \warning It sets the object to an undefined value.
   469         Arc() { }
   470         /// Copy constructor.
   471 
   472         /// Copy constructor.
   473         ///
   474         Arc(const Arc&) { }
   475         /// %Invalid constructor \& conversion.
   476 
   477         /// Initializes the object to be invalid.
   478         /// \sa Invalid for more details.
   479         Arc(Invalid) { }
   480         /// Equality operator
   481 
   482         /// Equality operator.
   483         ///
   484         /// Two iterators are equal if and only if they point to the
   485         /// same object or both are \c INVALID.
   486         bool operator==(Arc) const { return true; }
   487         /// Inequality operator
   488 
   489         /// Inequality operator.
   490         bool operator!=(Arc) const { return true; }
   491 
   492         /// Artificial ordering operator.
   493 
   494         /// Artificial ordering operator.
   495         ///
   496         /// \note This operator only has to define some strict ordering of
   497         /// the arcs; this order has nothing to do with the iteration
   498         /// ordering of the arcs.
   499         bool operator<(Arc) const { return false; }
   500 
   501         /// Converison to \c Edge
   502 
   503         /// Converison to \c Edge.
   504         ///
   505         operator Edge() const { return Edge(); }
   506       };
   507 
   508       /// Iterator class for the arcs.
   509 
   510       /// This iterator goes through each directed arc of the graph.
   511       /// Its usage is quite simple, for example, you can count the number
   512       /// of arcs in a graph \c g of type \c %BpGraph as follows:
   513       ///\code
   514       /// int count=0;
   515       /// for(BpGraph::ArcIt a(g); a!=INVALID; ++a) ++count;
   516       ///\endcode
   517       class ArcIt : public Arc {
   518       public:
   519         /// Default constructor
   520 
   521         /// Default constructor.
   522         /// \warning It sets the iterator to an undefined value.
   523         ArcIt() { }
   524         /// Copy constructor.
   525 
   526         /// Copy constructor.
   527         ///
   528         ArcIt(const ArcIt& e) : Arc(e) { }
   529         /// %Invalid constructor \& conversion.
   530 
   531         /// Initializes the iterator to be invalid.
   532         /// \sa Invalid for more details.
   533         ArcIt(Invalid) { }
   534         /// Sets the iterator to the first arc.
   535 
   536         /// Sets the iterator to the first arc of the given graph.
   537         ///
   538         explicit ArcIt(const BpGraph &g) { ignore_unused_variable_warning(g); }
   539         /// Sets the iterator to the given arc.
   540 
   541         /// Sets the iterator to the given arc of the given graph.
   542         ///
   543         ArcIt(const BpGraph&, const Arc&) { }
   544         /// Next arc
   545 
   546         /// Assign the iterator to the next arc.
   547         ///
   548         ArcIt& operator++() { return *this; }
   549       };
   550 
   551       /// Iterator class for the outgoing arcs of a node.
   552 
   553       /// This iterator goes trough the \e outgoing directed arcs of a
   554       /// certain node of a graph.
   555       /// Its usage is quite simple, for example, you can count the number
   556       /// of outgoing arcs of a node \c n
   557       /// in a graph \c g of type \c %BpGraph as follows.
   558       ///\code
   559       /// int count=0;
   560       /// for (Digraph::OutArcIt a(g, n); a!=INVALID; ++a) ++count;
   561       ///\endcode
   562       class OutArcIt : public Arc {
   563       public:
   564         /// Default constructor
   565 
   566         /// Default constructor.
   567         /// \warning It sets the iterator to an undefined value.
   568         OutArcIt() { }
   569         /// Copy constructor.
   570 
   571         /// Copy constructor.
   572         ///
   573         OutArcIt(const OutArcIt& e) : Arc(e) { }
   574         /// %Invalid constructor \& conversion.
   575 
   576         /// Initializes the iterator to be invalid.
   577         /// \sa Invalid for more details.
   578         OutArcIt(Invalid) { }
   579         /// Sets the iterator to the first outgoing arc.
   580 
   581         /// Sets the iterator to the first outgoing arc of the given node.
   582         ///
   583         OutArcIt(const BpGraph& n, const Node& g) {
   584           ignore_unused_variable_warning(n);
   585           ignore_unused_variable_warning(g);
   586         }
   587         /// Sets the iterator to the given arc.
   588 
   589         /// Sets the iterator to the given arc of the given graph.
   590         ///
   591         OutArcIt(const BpGraph&, const Arc&) { }
   592         /// Next outgoing arc
   593 
   594         /// Assign the iterator to the next
   595         /// outgoing arc of the corresponding node.
   596         OutArcIt& operator++() { return *this; }
   597       };
   598 
   599       /// Iterator class for the incoming arcs of a node.
   600 
   601       /// This iterator goes trough the \e incoming directed arcs of a
   602       /// certain node of a graph.
   603       /// Its usage is quite simple, for example, you can count the number
   604       /// of incoming arcs of a node \c n
   605       /// in a graph \c g of type \c %BpGraph as follows.
   606       ///\code
   607       /// int count=0;
   608       /// for (Digraph::InArcIt a(g, n); a!=INVALID; ++a) ++count;
   609       ///\endcode
   610       class InArcIt : public Arc {
   611       public:
   612         /// Default constructor
   613 
   614         /// Default constructor.
   615         /// \warning It sets the iterator to an undefined value.
   616         InArcIt() { }
   617         /// Copy constructor.
   618 
   619         /// Copy constructor.
   620         ///
   621         InArcIt(const InArcIt& e) : Arc(e) { }
   622         /// %Invalid constructor \& conversion.
   623 
   624         /// Initializes the iterator to be invalid.
   625         /// \sa Invalid for more details.
   626         InArcIt(Invalid) { }
   627         /// Sets the iterator to the first incoming arc.
   628 
   629         /// Sets the iterator to the first incoming arc of the given node.
   630         ///
   631         InArcIt(const BpGraph& g, const Node& n) {
   632           ignore_unused_variable_warning(n);
   633           ignore_unused_variable_warning(g);
   634         }
   635         /// Sets the iterator to the given arc.
   636 
   637         /// Sets the iterator to the given arc of the given graph.
   638         ///
   639         InArcIt(const BpGraph&, const Arc&) { }
   640         /// Next incoming arc
   641 
   642         /// Assign the iterator to the next
   643         /// incoming arc of the corresponding node.
   644         InArcIt& operator++() { return *this; }
   645       };
   646 
   647       /// \brief Standard graph map type for the nodes.
   648       ///
   649       /// Standard graph map type for the nodes.
   650       /// It conforms to the ReferenceMap concept.
   651       template<class T>
   652       class NodeMap : public ReferenceMap<Node, T, T&, const T&>
   653       {
   654       public:
   655 
   656         /// Constructor
   657         explicit NodeMap(const BpGraph&) { }
   658         /// Constructor with given initial value
   659         NodeMap(const BpGraph&, T) { }
   660 
   661       private:
   662         ///Copy constructor
   663         NodeMap(const NodeMap& nm) :
   664           ReferenceMap<Node, T, T&, const T&>(nm) { }
   665         ///Assignment operator
   666         template <typename CMap>
   667         NodeMap& operator=(const CMap&) {
   668           checkConcept<ReadMap<Node, T>, CMap>();
   669           return *this;
   670         }
   671       };
   672 
   673       /// \brief Standard graph map type for the red nodes.
   674       ///
   675       /// Standard graph map type for the red nodes.
   676       /// It conforms to the ReferenceMap concept.
   677       template<class T>
   678       class RedMap : public ReferenceMap<Node, T, T&, const T&>
   679       {
   680       public:
   681 
   682         /// Constructor
   683         explicit RedMap(const BpGraph&) { }
   684         /// Constructor with given initial value
   685         RedMap(const BpGraph&, T) { }
   686 
   687       private:
   688         ///Copy constructor
   689         RedMap(const RedMap& nm) :
   690           ReferenceMap<Node, T, T&, const T&>(nm) { }
   691         ///Assignment operator
   692         template <typename CMap>
   693         RedMap& operator=(const CMap&) {
   694           checkConcept<ReadMap<Node, T>, CMap>();
   695           return *this;
   696         }
   697       };
   698 
   699       /// \brief Standard graph map type for the blue nodes.
   700       ///
   701       /// Standard graph map type for the blue nodes.
   702       /// It conforms to the ReferenceMap concept.
   703       template<class T>
   704       class BlueMap : public ReferenceMap<Node, T, T&, const T&>
   705       {
   706       public:
   707 
   708         /// Constructor
   709         explicit BlueMap(const BpGraph&) { }
   710         /// Constructor with given initial value
   711         BlueMap(const BpGraph&, T) { }
   712 
   713       private:
   714         ///Copy constructor
   715         BlueMap(const BlueMap& nm) :
   716           ReferenceMap<Node, T, T&, const T&>(nm) { }
   717         ///Assignment operator
   718         template <typename CMap>
   719         BlueMap& operator=(const CMap&) {
   720           checkConcept<ReadMap<Node, T>, CMap>();
   721           return *this;
   722         }
   723       };
   724 
   725       /// \brief Standard graph map type for the arcs.
   726       ///
   727       /// Standard graph map type for the arcs.
   728       /// It conforms to the ReferenceMap concept.
   729       template<class T>
   730       class ArcMap : public ReferenceMap<Arc, T, T&, const T&>
   731       {
   732       public:
   733 
   734         /// Constructor
   735         explicit ArcMap(const BpGraph&) { }
   736         /// Constructor with given initial value
   737         ArcMap(const BpGraph&, T) { }
   738 
   739       private:
   740         ///Copy constructor
   741         ArcMap(const ArcMap& em) :
   742           ReferenceMap<Arc, T, T&, const T&>(em) { }
   743         ///Assignment operator
   744         template <typename CMap>
   745         ArcMap& operator=(const CMap&) {
   746           checkConcept<ReadMap<Arc, T>, CMap>();
   747           return *this;
   748         }
   749       };
   750 
   751       /// \brief Standard graph map type for the edges.
   752       ///
   753       /// Standard graph map type for the edges.
   754       /// It conforms to the ReferenceMap concept.
   755       template<class T>
   756       class EdgeMap : public ReferenceMap<Edge, T, T&, const T&>
   757       {
   758       public:
   759 
   760         /// Constructor
   761         explicit EdgeMap(const BpGraph&) { }
   762         /// Constructor with given initial value
   763         EdgeMap(const BpGraph&, T) { }
   764 
   765       private:
   766         ///Copy constructor
   767         EdgeMap(const EdgeMap& em) :
   768           ReferenceMap<Edge, T, T&, const T&>(em) {}
   769         ///Assignment operator
   770         template <typename CMap>
   771         EdgeMap& operator=(const CMap&) {
   772           checkConcept<ReadMap<Edge, T>, CMap>();
   773           return *this;
   774         }
   775       };
   776 
   777       /// \brief Gives back %true for red nodes.
   778       ///
   779       /// Gives back %true for red nodes.
   780       bool red(const Node&) const { return true; }
   781 
   782       /// \brief Gives back %true for blue nodes.
   783       ///
   784       /// Gives back %true for blue nodes.
   785       bool blue(const Node&) const { return true; }
   786 
   787       /// \brief Gives back the red end node of the edge.
   788       /// 
   789       /// Gives back the red end node of the edge.
   790       Node redNode(const Edge&) const { return Node(); }
   791 
   792       /// \brief Gives back the blue end node of the edge.
   793       /// 
   794       /// Gives back the blue end node of the edge.
   795       Node blueNode(const Edge&) const { return Node(); }
   796 
   797       /// \brief The first node of the edge.
   798       ///
   799       /// It is a synonim for the \c redNode().
   800       Node u(Edge) const { return INVALID; }
   801 
   802       /// \brief The second node of the edge.
   803       ///
   804       /// It is a synonim for the \c blueNode().
   805       Node v(Edge) const { return INVALID; }
   806 
   807       /// \brief The source node of the arc.
   808       ///
   809       /// Returns the source node of the given arc.
   810       Node source(Arc) const { return INVALID; }
   811 
   812       /// \brief The target node of the arc.
   813       ///
   814       /// Returns the target node of the given arc.
   815       Node target(Arc) const { return INVALID; }
   816 
   817       /// \brief The ID of the node.
   818       ///
   819       /// Returns the ID of the given node.
   820       int id(Node) const { return -1; }
   821 
   822       /// \brief The red ID of the node.
   823       ///
   824       /// Returns the red ID of the given node.
   825       int redId(Node) const { return -1; }
   826 
   827       /// \brief The red ID of the node.
   828       ///
   829       /// Returns the red ID of the given node.
   830       int id(RedNode) const { return -1; }
   831 
   832       /// \brief The blue ID of the node.
   833       ///
   834       /// Returns the blue ID of the given node.
   835       int blueId(Node) const { return -1; }
   836 
   837       /// \brief The blue ID of the node.
   838       ///
   839       /// Returns the blue ID of the given node.
   840       int id(BlueNode) const { return -1; }
   841 
   842       /// \brief The ID of the edge.
   843       ///
   844       /// Returns the ID of the given edge.
   845       int id(Edge) const { return -1; }
   846 
   847       /// \brief The ID of the arc.
   848       ///
   849       /// Returns the ID of the given arc.
   850       int id(Arc) const { return -1; }
   851 
   852       /// \brief The node with the given ID.
   853       ///
   854       /// Returns the node with the given ID.
   855       /// \pre The argument should be a valid node ID in the graph.
   856       Node nodeFromId(int) const { return INVALID; }
   857 
   858       /// \brief The edge with the given ID.
   859       ///
   860       /// Returns the edge with the given ID.
   861       /// \pre The argument should be a valid edge ID in the graph.
   862       Edge edgeFromId(int) const { return INVALID; }
   863 
   864       /// \brief The arc with the given ID.
   865       ///
   866       /// Returns the arc with the given ID.
   867       /// \pre The argument should be a valid arc ID in the graph.
   868       Arc arcFromId(int) const { return INVALID; }
   869 
   870       /// \brief An upper bound on the node IDs.
   871       ///
   872       /// Returns an upper bound on the node IDs.
   873       int maxNodeId() const { return -1; }
   874 
   875       /// \brief An upper bound on the red IDs.
   876       ///
   877       /// Returns an upper bound on the red IDs.
   878       int maxRedId() const { return -1; }
   879 
   880       /// \brief An upper bound on the blue IDs.
   881       ///
   882       /// Returns an upper bound on the blue IDs.
   883       int maxBlueId() const { return -1; }
   884 
   885       /// \brief An upper bound on the edge IDs.
   886       ///
   887       /// Returns an upper bound on the edge IDs.
   888       int maxEdgeId() const { return -1; }
   889 
   890       /// \brief An upper bound on the arc IDs.
   891       ///
   892       /// Returns an upper bound on the arc IDs.
   893       int maxArcId() const { return -1; }
   894 
   895       /// \brief The direction of the arc.
   896       ///
   897       /// Returns \c true if the given arc goes from a red node to a blue node.
   898       bool direction(Arc) const { return true; }
   899 
   900       /// \brief Direct the edge.
   901       ///
   902       /// Direct the given edge. The returned arc
   903       /// represents the given edge and its direction comes
   904       /// from the bool parameter. If it is \c true, then the source of the node
   905       /// will be a red node.
   906       Arc direct(Edge, bool) const {
   907         return INVALID;
   908       }
   909 
   910       /// \brief Direct the edge.
   911       ///
   912       /// Direct the given edge. The returned arc represents the given
   913       /// edge and its source node is the given node.
   914       Arc direct(Edge, Node) const {
   915         return INVALID;
   916       }
   917 
   918       /// \brief The oppositely directed arc.
   919       ///
   920       /// Returns the oppositely directed arc representing the same edge.
   921       Arc oppositeArc(Arc) const { return INVALID; }
   922 
   923       /// \brief The opposite node on the edge.
   924       ///
   925       /// Returns the opposite node on the given edge.
   926       Node oppositeNode(Node, Edge) const { return INVALID; }
   927 
   928       void first(Node&) const {}
   929       void next(Node&) const {}
   930 
   931       void firstRed(Node&) const {}
   932       void nextRed(Node&) const {}
   933 
   934       void firstBlue(Node&) const {}
   935       void nextBlue(Node&) const {}
   936 
   937       void first(Edge&) const {}
   938       void next(Edge&) const {}
   939 
   940       void first(Arc&) const {}
   941       void next(Arc&) const {}
   942 
   943       void firstOut(Arc&, Node) const {}
   944       void nextOut(Arc&) const {}
   945 
   946       void firstIn(Arc&, Node) const {}
   947       void nextIn(Arc&) const {}
   948 
   949       void firstInc(Edge &, bool &, const Node &) const {}
   950       void nextInc(Edge &, bool &) const {}
   951 
   952       // The second parameter is dummy.
   953       Node fromId(int, Node) const { return INVALID; }
   954       // The second parameter is dummy.
   955       Edge fromId(int, Edge) const { return INVALID; }
   956       // The second parameter is dummy.
   957       Arc fromId(int, Arc) const { return INVALID; }
   958 
   959       // Dummy parameter.
   960       int maxId(Node) const { return -1; }
   961       // Dummy parameter.
   962       int maxId(RedNode) const { return -1; }
   963       // Dummy parameter.
   964       int maxId(BlueNode) const { return -1; }
   965       // Dummy parameter.
   966       int maxId(Edge) const { return -1; }
   967       // Dummy parameter.
   968       int maxId(Arc) const { return -1; }
   969 
   970       /// \brief The base node of the iterator.
   971       ///
   972       /// Returns the base node of the given incident edge iterator.
   973       Node baseNode(IncEdgeIt) const { return INVALID; }
   974 
   975       /// \brief The running node of the iterator.
   976       ///
   977       /// Returns the running node of the given incident edge iterator.
   978       Node runningNode(IncEdgeIt) const { return INVALID; }
   979 
   980       /// \brief The base node of the iterator.
   981       ///
   982       /// Returns the base node of the given outgoing arc iterator
   983       /// (i.e. the source node of the corresponding arc).
   984       Node baseNode(OutArcIt) const { return INVALID; }
   985 
   986       /// \brief The running node of the iterator.
   987       ///
   988       /// Returns the running node of the given outgoing arc iterator
   989       /// (i.e. the target node of the corresponding arc).
   990       Node runningNode(OutArcIt) const { return INVALID; }
   991 
   992       /// \brief The base node of the iterator.
   993       ///
   994       /// Returns the base node of the given incomming arc iterator
   995       /// (i.e. the target node of the corresponding arc).
   996       Node baseNode(InArcIt) const { return INVALID; }
   997 
   998       /// \brief The running node of the iterator.
   999       ///
  1000       /// Returns the running node of the given incomming arc iterator
  1001       /// (i.e. the source node of the corresponding arc).
  1002       Node runningNode(InArcIt) const { return INVALID; }
  1003 
  1004       template <typename _BpGraph>
  1005       struct Constraints {
  1006         void constraints() {
  1007           checkConcept<BaseBpGraphComponent, _BpGraph>();
  1008           checkConcept<IterableBpGraphComponent<>, _BpGraph>();
  1009           checkConcept<IDableBpGraphComponent<>, _BpGraph>();
  1010           checkConcept<MappableBpGraphComponent<>, _BpGraph>();
  1011         }
  1012       };
  1013 
  1014     };
  1015 
  1016   }
  1017 
  1018 }
  1019 
  1020 #endif