lemon/smart_graph.h
changeset 1910 f95eea8c34b0
parent 1909 2d806130e700
child 1956 a055123339d5
     1.1 --- a/lemon/smart_graph.h	Thu Jan 26 15:42:13 2006 +0000
     1.2 +++ b/lemon/smart_graph.h	Thu Jan 26 16:24:40 2006 +0000
     1.3 @@ -378,12 +378,12 @@
     1.4    };
     1.5  
     1.6  
     1.7 -  class SmartUBipartiteGraphBase {
     1.8 +  class SmartBpUGraphBase {
     1.9    public:
    1.10  
    1.11      class NodeSetError : public LogicError {
    1.12        virtual const char* exceptionName() const { 
    1.13 -	return "lemon::FullUBipartiteGraph::NodeSetError";
    1.14 +	return "lemon::SmartBpUGraph::NodeSetError";
    1.15        }
    1.16      };
    1.17  
    1.18 @@ -396,19 +396,19 @@
    1.19      };
    1.20  
    1.21      struct EdgeT {
    1.22 -      int upper, next_down;
    1.23 -      int lower, next_up;
    1.24 +      int aNode, next_out;
    1.25 +      int bNode, next_in;
    1.26      };
    1.27  
    1.28 -    std::vector<NodeT> upperNodes;
    1.29 -    std::vector<NodeT> lowerNodes;
    1.30 +    std::vector<NodeT> aNodes;
    1.31 +    std::vector<NodeT> bNodes;
    1.32  
    1.33      std::vector<EdgeT> edges;
    1.34  
    1.35    public:
    1.36    
    1.37      class Node {
    1.38 -      friend class SmartUBipartiteGraphBase;
    1.39 +      friend class SmartBpUGraphBase;
    1.40      protected:
    1.41        int id;
    1.42  
    1.43 @@ -422,7 +422,7 @@
    1.44      };
    1.45  
    1.46      class Edge {
    1.47 -      friend class SmartUBipartiteGraphBase;
    1.48 +      friend class SmartBpUGraphBase;
    1.49      protected:
    1.50        int id;
    1.51  
    1.52 @@ -435,33 +435,33 @@
    1.53        bool operator<(const Edge i) const {return id<i.id;}
    1.54      };
    1.55  
    1.56 -    void firstUpper(Node& node) const {
    1.57 -      node.id = 2 * upperNodes.size() - 2;
    1.58 +    void firstANode(Node& node) const {
    1.59 +      node.id = 2 * aNodes.size() - 2;
    1.60        if (node.id < 0) node.id = -1; 
    1.61      }
    1.62 -    void nextUpper(Node& node) const {
    1.63 +    void nextANode(Node& node) const {
    1.64        node.id -= 2;
    1.65        if (node.id < 0) node.id = -1; 
    1.66      }
    1.67  
    1.68 -    void firstLower(Node& node) const {
    1.69 -      node.id = 2 * lowerNodes.size() - 1;
    1.70 +    void firstBNode(Node& node) const {
    1.71 +      node.id = 2 * bNodes.size() - 1;
    1.72      }
    1.73 -    void nextLower(Node& node) const {
    1.74 +    void nextBNode(Node& node) const {
    1.75        node.id -= 2;
    1.76      }
    1.77  
    1.78      void first(Node& node) const {
    1.79 -      if (upperNodes.size() > 0) {
    1.80 -	node.id = 2 * upperNodes.size() - 2;
    1.81 +      if (aNodes.size() > 0) {
    1.82 +	node.id = 2 * aNodes.size() - 2;
    1.83        } else {
    1.84 -	node.id = 2 * lowerNodes.size() - 1;
    1.85 +	node.id = 2 * bNodes.size() - 1;
    1.86        }
    1.87      }
    1.88      void next(Node& node) const {
    1.89        node.id -= 2;
    1.90        if (node.id == -2) {
    1.91 -	node.id = 2 * lowerNodes.size() - 1;
    1.92 +	node.id = 2 * bNodes.size() - 1;
    1.93        }
    1.94      }
    1.95    
    1.96 @@ -472,20 +472,20 @@
    1.97        --edge.id;
    1.98      }
    1.99  
   1.100 -    void firstDown(Edge& edge, const Node& node) const {
   1.101 +    void firstOut(Edge& edge, const Node& node) const {
   1.102        LEMON_ASSERT((node.id & 1) == 0, NodeSetError());
   1.103 -      edge.id = upperNodes[node.id >> 1].first;
   1.104 +      edge.id = aNodes[node.id >> 1].first;
   1.105      }
   1.106 -    void nextDown(Edge& edge) const {
   1.107 -      edge.id = edges[edge.id].next_down;
   1.108 +    void nextOut(Edge& edge) const {
   1.109 +      edge.id = edges[edge.id].next_out;
   1.110      }
   1.111  
   1.112 -    void firstUp(Edge& edge, const Node& node) const {
   1.113 +    void firstIn(Edge& edge, const Node& node) const {
   1.114        LEMON_ASSERT((node.id & 1) == 1, NodeSetError());
   1.115 -      edge.id = lowerNodes[node.id >> 1].first;
   1.116 +      edge.id = bNodes[node.id >> 1].first;
   1.117      }
   1.118 -    void nextUp(Edge& edge) const {
   1.119 -      edge.id = edges[edge.id].next_up;
   1.120 +    void nextIn(Edge& edge) const {
   1.121 +      edge.id = edges[edge.id].next_in;
   1.122      }
   1.123  
   1.124      static int id(const Node& node) {
   1.125 @@ -495,8 +495,8 @@
   1.126        return Node(id);
   1.127      }
   1.128      int maxNodeId() const {
   1.129 -      return upperNodes.size() > lowerNodes.size() ?
   1.130 -	upperNodes.size() * 2 - 2 : lowerNodes.size() * 2 - 1;
   1.131 +      return aNodes.size() > bNodes.size() ?
   1.132 +	aNodes.size() * 2 - 2 : bNodes.size() * 2 - 1;
   1.133      }
   1.134    
   1.135      static int id(const Edge& edge) {
   1.136 @@ -509,95 +509,103 @@
   1.137        return edges.size();
   1.138      }
   1.139    
   1.140 -    static int upperId(const Node& node) {
   1.141 +    static int aNodeId(const Node& node) {
   1.142        return node.id >> 1;
   1.143      }
   1.144 -    static Node fromUpperId(int id, Node) {
   1.145 +    static Node fromANodeId(int id, Node) {
   1.146        return Node(id << 1);
   1.147      }
   1.148 -    int maxUpperId() const {
   1.149 -      return upperNodes.size();
   1.150 +    int maxANodeId() const {
   1.151 +      return aNodes.size();
   1.152      }
   1.153  
   1.154 -    static int lowerId(const Node& node) {
   1.155 +    static int bNodeId(const Node& node) {
   1.156        return node.id >> 1;
   1.157      }
   1.158 -    static Node fromLowerId(int id) {
   1.159 +    static Node fromBNodeId(int id) {
   1.160        return Node((id << 1) + 1);
   1.161      }
   1.162 -    int maxLowerId() const {
   1.163 -      return lowerNodes.size();
   1.164 +    int maxBNodeId() const {
   1.165 +      return bNodes.size();
   1.166      }
   1.167  
   1.168 -    Node upperNode(const Edge& edge) const {
   1.169 -      return Node(edges[edge.id].upper);
   1.170 +    Node aNode(const Edge& edge) const {
   1.171 +      return Node(edges[edge.id].aNode);
   1.172      }
   1.173 -    Node lowerNode(const Edge& edge) const {
   1.174 -      return Node(edges[edge.id].lower);
   1.175 +    Node bNode(const Edge& edge) const {
   1.176 +      return Node(edges[edge.id].bNode);
   1.177      }
   1.178  
   1.179 -    static bool upper(const Node& node) {
   1.180 +    static bool aNode(const Node& node) {
   1.181        return (node.id & 1) == 0;
   1.182      }
   1.183  
   1.184 -    static bool lower(const Node& node) {
   1.185 +    static bool bNode(const Node& node) {
   1.186        return (node.id & 1) == 1;
   1.187      }
   1.188  
   1.189 -    Node addUpperNode() {
   1.190 +    Node addANode() {
   1.191        NodeT nodeT;
   1.192        nodeT.first = -1;
   1.193 -      upperNodes.push_back(nodeT);
   1.194 -      return Node(upperNodes.size() * 2 - 2);
   1.195 +      aNodes.push_back(nodeT);
   1.196 +      return Node(aNodes.size() * 2 - 2);
   1.197      }
   1.198  
   1.199 -    Node addLowerNode() {
   1.200 +    Node addBNode() {
   1.201        NodeT nodeT;
   1.202        nodeT.first = -1;
   1.203 -      lowerNodes.push_back(nodeT);
   1.204 -      return Node(lowerNodes.size() * 2 - 1);
   1.205 +      bNodes.push_back(nodeT);
   1.206 +      return Node(bNodes.size() * 2 - 1);
   1.207      }
   1.208  
   1.209      Edge addEdge(const Node& source, const Node& target) {
   1.210        LEMON_ASSERT(((source.id ^ target.id) & 1) == 1, NodeSetError());
   1.211        EdgeT edgeT;
   1.212        if ((source.id & 1) == 0) {
   1.213 -	edgeT.upper = source.id;
   1.214 -	edgeT.lower = target.id;
   1.215 +	edgeT.aNode = source.id;
   1.216 +	edgeT.bNode = target.id;
   1.217        } else {
   1.218 -	edgeT.upper = target.id;
   1.219 -	edgeT.lower = source.id;
   1.220 +	edgeT.aNode = target.id;
   1.221 +	edgeT.bNode = source.id;
   1.222        }
   1.223 -      edgeT.next_down = upperNodes[edgeT.upper >> 1].first;
   1.224 -      upperNodes[edgeT.upper >> 1].first = edges.size();
   1.225 -      edgeT.next_up = lowerNodes[edgeT.lower >> 1].first;
   1.226 -      lowerNodes[edgeT.lower >> 1].first = edges.size();
   1.227 +      edgeT.next_out = aNodes[edgeT.aNode >> 1].first;
   1.228 +      aNodes[edgeT.aNode >> 1].first = edges.size();
   1.229 +      edgeT.next_in = bNodes[edgeT.bNode >> 1].first;
   1.230 +      bNodes[edgeT.bNode >> 1].first = edges.size();
   1.231        edges.push_back(edgeT);
   1.232        return Edge(edges.size() - 1);
   1.233      }
   1.234  
   1.235      void clear() {
   1.236 -      upperNodes.clear();
   1.237 -      lowerNodes.clear();
   1.238 +      aNodes.clear();
   1.239 +      bNodes.clear();
   1.240        edges.clear();
   1.241      }
   1.242  
   1.243    };
   1.244  
   1.245  
   1.246 -  typedef ClearableUBipartiteGraphExtender<
   1.247 -    ExtendableUBipartiteGraphExtender<
   1.248 -    MappableUBipartiteGraphExtender<
   1.249 -    IterableUBipartiteGraphExtender<
   1.250 -    AlterableUBipartiteGraphExtender<
   1.251 -    UBipartiteGraphExtender <
   1.252 -    SmartUBipartiteGraphBase> > > > > >
   1.253 -  ExtendedSmartUBipartiteGraphBase;
   1.254 +  typedef ClearableBpUGraphExtender<
   1.255 +    ExtendableBpUGraphExtender<
   1.256 +    MappableBpUGraphExtender<
   1.257 +    IterableBpUGraphExtender<
   1.258 +    AlterableBpUGraphExtender<
   1.259 +    BpUGraphExtender <
   1.260 +    SmartBpUGraphBase> > > > > >
   1.261 +  ExtendedSmartBpUGraphBase;
   1.262  
   1.263 -
   1.264 -  class SmartUBipartiteGraph : 
   1.265 -    public ExtendedSmartUBipartiteGraphBase {
   1.266 -  };
   1.267 +  /// \ingroup graphs
   1.268 +  ///
   1.269 +  /// \brief A smart bipartite undirected graph class.
   1.270 +  ///
   1.271 +  /// This is a simple and fast bipartite undirected graph implementation.
   1.272 +  /// It is also quite memory efficient, but at the price
   1.273 +  /// that <b> it does not support node and edge deletions</b>.
   1.274 +  /// Except from this it conforms to 
   1.275 +  /// the \ref concept::BpUGraph "BpUGraph" concept.
   1.276 +  /// \sa concept::BpUGraph.
   1.277 +  ///
   1.278 +  class SmartBpUGraph : public ExtendedSmartBpUGraphBase {};
   1.279  
   1.280    
   1.281    /// @}