lemon/concepts/bpgraph.h
changeset 1018 2e959a5a0c2d
child 1025 c8fa41fcc4a7
equal deleted inserted replaced
-1:000000000000 0:142b410bcc44
       
     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