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