gravatar
kpeter (Peter Kovacs)
kpeter@inf.elte.hu
Improvements related to full graphs (#57)
0 2 0
default
2 files changed with 68 insertions and 64 deletions:
↑ Collapse diff ↑
Ignore white space 12 line context
... ...
@@ -16,20 +16,19 @@
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_FULL_GRAPH_H
20 20
#define LEMON_FULL_GRAPH_H
21 21

	
22
#include <lemon/math.h>
23

	
24 22
#include <lemon/core.h>
25 23
#include <lemon/bits/graph_extender.h>
26 24

	
27 25
///\ingroup graphs
28 26
///\file
29
///\brief FullDigraph and FullGraph classes.
27
///\brief FullGraph and FullDigraph classes.
28

	
30 29
namespace lemon {
31 30

	
32 31
  class FullDigraphBase {
33 32
  public:
34 33

	
35 34
    typedef FullDigraphBase Graph;
... ...
@@ -64,27 +63,24 @@
64 63
    int maxNodeId() const { return _node_num - 1; }
65 64
    int maxArcId() const { return _arc_num - 1; }
66 65

	
67 66
    Node source(Arc arc) const { return arc._id / _node_num; }
68 67
    Node target(Arc arc) const { return arc._id % _node_num; }
69 68

	
70

	
71 69
    static int id(Node node) { return node._id; }
72 70
    static int id(Arc arc) { return arc._id; }
73 71

	
74 72
    static Node nodeFromId(int id) { return Node(id);}
75

	
76 73
    static Arc arcFromId(int id) { return Arc(id);}
77 74

	
78 75
    typedef True FindArcTag;
79 76

	
80 77
    Arc findArc(Node s, Node t, Arc prev = INVALID) const {
81 78
      return prev != INVALID ? arc(s, t) : INVALID;
82 79
    }
83 80

	
84

	
85 81
    class Node {
86 82
      friend class FullDigraphBase;
87 83

	
88 84
    protected:
89 85
      int _id;
90 86
      Node(int id) : _id(id) {}
... ...
@@ -154,68 +150,74 @@
154 150
  ///
155 151
  /// \brief A full digraph class.
156 152
  ///
157 153
  /// This is a simple and fast directed full graph implementation.
158 154
  /// From each node go arcs to each node (including the source node),
159 155
  /// therefore the number of the arcs in the digraph is the square of
160
  /// the node number. The digraph is completely static, so you can
161
  /// neither add nor delete either arcs or nodes, and it needs just
156
  /// the node number. This digraph type is completely static, so you
157
  /// can neither add nor delete either arcs or nodes, and it needs
162 158
  /// constant space in memory.
163 159
  ///
164
  /// Thus it conforms to the \ref concepts::Digraph "Digraph" concept
160
  /// This class conforms to the \ref concepts::Digraph "Digraph" concept
165 161
  /// and it also has an important extra feature that its maps are
166 162
  /// real \ref concepts::ReferenceMap "reference map"s.
167
  /// \sa concepts::Digraph.
163
  ///
164
  /// The \c FullDigraph and \c FullGraph classes are very similar,
165
  /// but there are two differences. While this class conforms only
166
  /// to the \ref concepts::Digraph "Digraph" concept, the \c FullGraph
167
  /// class conforms to the \ref concepts::Graph "Graph" concept,
168
  /// moreover \c FullGraph does not contain a loop arc for each
169
  /// node as \c FullDigraph does.
168 170
  ///
169 171
  /// \sa FullGraph
170 172
  class FullDigraph : public ExtendedFullDigraphBase {
171 173
  public:
172 174

	
173 175
    typedef ExtendedFullDigraphBase Parent;
174 176

	
175 177
    /// \brief Constructor
176 178
    FullDigraph() { construct(0); }
177 179

	
178 180
    /// \brief Constructor
179 181
    ///
182
    /// Constructor.
180 183
    /// \param n The number of the nodes.
181 184
    FullDigraph(int n) { construct(n); }
182 185

	
183
    /// \brief Resize the digraph
186
    /// \brief Resizes the digraph
184 187
    ///
185
    /// Resize the digraph. The function will fully destroy and
186
    /// rebuild the digraph.  This cause that the maps of the digraph
187
    /// will reallocated automatically and the previous values will be
188
    /// lost.
188
    /// Resizes the digraph. The function will fully destroy and
189
    /// rebuild the digraph. This cause that the maps of the digraph will
190
    /// reallocated automatically and the previous values will be lost.
189 191
    void resize(int n) {
190 192
      Parent::notifier(Arc()).clear();
191 193
      Parent::notifier(Node()).clear();
192 194
      construct(n);
193 195
      Parent::notifier(Node()).build();
194 196
      Parent::notifier(Arc()).build();
195 197
    }
196 198

	
197 199
    /// \brief Returns the node with the given index.
198 200
    ///
199
    /// Returns the node with the given index. Because it is a
200
    /// static size digraph the node's of the digraph can be indexed
201
    /// in the range <tt>[0..nodeNum()-1]</tt> and the index of
202
    /// the node can accessed by the \e index() member.
201
    /// Returns the node with the given index. Since it is a static
202
    /// digraph its nodes can be indexed with integers from the range
203
    /// <tt>[0..nodeNum()-1]</tt>.
204
    /// \sa index()
203 205
    Node operator()(int ix) const { return Parent::operator()(ix); }
204 206

	
205
    /// \brief Returns the index of the node.
207
    /// \brief Returns the index of the given node.
206 208
    ///
207
    /// Returns the index of the node. Because it is a
208
    /// static size digraph the node's of the digraph can be indexed
209
    /// in the range <tt>[0..nodeNum()-1]</tt> and the index of
210
    /// the node can accessed by the \e index() member.
209
    /// Returns the index of the given node. Since it is a static
210
    /// digraph its nodes can be indexed with integers from the range
211
    /// <tt>[0..nodeNum()-1]</tt>.
212
    /// \sa operator()
211 213
    int index(const Node& node) const { return Parent::index(node); }
212 214

	
213
    /// \brief Returns the arc connects the given nodes.
215
    /// \brief Returns the arc connecting the given nodes.
214 216
    ///
215
    /// Returns the arc connects the given nodes.
217
    /// Returns the arc connecting the given nodes.
216 218
    Arc arc(const Node& u, const Node& v) const {
217 219
      return Parent::arc(u, v);
218 220
    }
219 221

	
220 222
    /// \brief Number of nodes.
221 223
    int nodeNum() const { return Parent::nodeNum(); }
... ...
@@ -277,13 +279,12 @@
277 279
        return (_node_num - 1 - u) * _node_num - v - 1;
278 280
      }
279 281
    }
280 282

	
281 283
  public:
282 284

	
283

	
284 285
    Node operator()(int ix) const { return Node(ix); }
285 286
    int index(const Node& node) const { return node._id; }
286 287

	
287 288
    Edge edge(const Node& u, const Node& v) const {
288 289
      if (u._id < v._id) {
289 290
        return Edge(_eid(u._id, v._id));
... ...
@@ -364,12 +365,13 @@
364 365
      bool operator!=(const Node node) const {return _id != node._id;}
365 366
      bool operator<(const Node node) const {return _id < node._id;}
366 367
    };
367 368

	
368 369
    class Edge {
369 370
      friend class FullGraphBase;
371
      friend class Arc;
370 372

	
371 373
    protected:
372 374
      int _id;
373 375

	
374 376
      Edge(int id) : _id(id) {}
375 377

	
... ...
@@ -515,93 +517,95 @@
515 517
  /// \ingroup graphs
516 518
  ///
517 519
  /// \brief An undirected full graph class.
518 520
  ///
519 521
  /// This is a simple and fast undirected full graph
520 522
  /// implementation. From each node go edge to each other node,
521
  /// therefore the number of edges in the graph is
522
  /// <tt>n(n-1)/2</tt>. It is completely static, so you can neither
523
  /// add nor delete either edges or nodes, and it needs just constant
523
  /// therefore the number of edges in the graph is \f$n(n-1)/2\f$.
524
  /// This graph type is completely static, so you can neither
525
  /// add nor delete either edges or nodes, and it needs constant
524 526
  /// space in memory.
525 527
  ///
526
  /// The \e FullDigraph and \e FullGraph classes are very similar,
527
  /// but there are two differences. While the \e FullDigraph class is
528
  /// conform just to the \ref concepts::Digraph "Digraph" concept,
529
  /// this class is conform to the \ref concepts::Graph "Graph"
530
  /// concept. In addition, the \e FullGraph class does not contain a
531
  /// loop arc from each node as the \e FullDigraph does.
528
  /// This class conforms to the \ref concepts::Graph "Graph" concept
529
  /// and it also has an important extra feature that its maps are
530
  /// real \ref concepts::ReferenceMap "reference map"s.
532 531
  ///
533
  /// It also has an important extra feature that its maps are real
534
  /// \ref concepts::ReferenceMap "reference map"s.
532
  /// The \c FullGraph and \c FullDigraph classes are very similar,
533
  /// but there are two differences. While the \c FullDigraph class
534
  /// conforms only to the \ref concepts::Digraph "Digraph" concept,
535
  /// this class conforms to the \ref concepts::Graph "Graph" concept,
536
  /// moreover \c FullGraph does not contain a loop arc for each
537
  /// node as \c FullDigraph does.
535 538
  ///
536 539
  /// \sa FullDigraph
537 540
  class FullGraph : public ExtendedFullGraphBase {
538 541
  public:
539 542

	
540 543
    typedef ExtendedFullGraphBase Parent;
541 544

	
542 545
    /// \brief Constructor
543 546
    FullGraph() { construct(0); }
544 547

	
545 548
    /// \brief Constructor
546 549
    ///
550
    /// Constructor.
547 551
    /// \param n The number of the nodes.
548 552
    FullGraph(int n) { construct(n); }
549 553

	
550
    /// \brief Resize the graph
554
    /// \brief Resizes the graph
551 555
    ///
552
    /// Resize the graph. The function will fully destroy and rebuild
553
    /// the graph.  This cause that the maps of the graph will
554
    /// reallocated automatically and the previous values will be
555
    /// lost.
556
    /// Resizes the graph. The function will fully destroy and
557
    /// rebuild the graph. This cause that the maps of the graph will
558
    /// reallocated automatically and the previous values will be lost.
556 559
    void resize(int n) {
557 560
      Parent::notifier(Arc()).clear();
558 561
      Parent::notifier(Edge()).clear();
559 562
      Parent::notifier(Node()).clear();
560 563
      construct(n);
561 564
      Parent::notifier(Node()).build();
562 565
      Parent::notifier(Edge()).build();
563 566
      Parent::notifier(Arc()).build();
564 567
    }
565 568

	
566 569
    /// \brief Returns the node with the given index.
567 570
    ///
568
    /// Returns the node with the given index. Because it is a static
569
    /// size graph the node's of the graph can be indexed in the range
570
    /// <tt>[0..nodeNum()-1]</tt> and the index of the node can
571
    /// accessed by the \e index() member.
571
    /// Returns the node with the given index. Since it is a static
572
    /// graph its nodes can be indexed with integers from the range
573
    /// <tt>[0..nodeNum()-1]</tt>.
574
    /// \sa index()
572 575
    Node operator()(int ix) const { return Parent::operator()(ix); }
573 576

	
574
    /// \brief Returns the index of the node.
577
    /// \brief Returns the index of the given node.
575 578
    ///
576
    /// Returns the index of the node. Because it is a static size
577
    /// graph the node's of the graph can be indexed in the range
578
    /// <tt>[0..nodeNum()-1]</tt> and the index of the node can
579
    /// accessed by the \e index() member.
579
    /// Returns the index of the given node. Since it is a static
580
    /// graph its nodes can be indexed with integers from the range
581
    /// <tt>[0..nodeNum()-1]</tt>.
582
    /// \sa operator()
580 583
    int index(const Node& node) const { return Parent::index(node); }
581 584

	
582
    /// \brief Number of nodes.
583
    int nodeNum() const { return Parent::nodeNum(); }
584
    /// \brief Number of arcs.
585
    int arcNum() const { return Parent::arcNum(); }
586
    /// \brief Number of edges.
587
    int edgeNum() const { return Parent::edgeNum(); }
588

	
589
    /// \brief Returns the arc connects the given nodes.
585
    /// \brief Returns the arc connecting the given nodes.
590 586
    ///
591
    /// Returns the arc connects the given nodes.
587
    /// Returns the arc connecting the given nodes.
592 588
    Arc arc(const Node& s, const Node& t) const {
593 589
      return Parent::arc(s, t);
594 590
    }
595 591

	
596 592
    /// \brief Returns the edge connects the given nodes.
597 593
    ///
598 594
    /// Returns the edge connects the given nodes.
599 595
    Edge edge(const Node& u, const Node& v) const {
600 596
      return Parent::edge(u, v);
601 597
    }
598

	
599
    /// \brief Number of nodes.
600
    int nodeNum() const { return Parent::nodeNum(); }
601
    /// \brief Number of arcs.
602
    int arcNum() const { return Parent::arcNum(); }
603
    /// \brief Number of edges.
604
    int edgeNum() const { return Parent::edgeNum(); }
605

	
602 606
  };
603 607

	
604 608

	
605 609
} //namespace lemon
606 610

	
607 611

	
Ignore white space 12 line context
... ...
@@ -139,15 +139,15 @@
139 139
  { // Checking SmartDigraph
140 140
    checkConcept<Digraph, SmartDigraph>();
141 141
    checkConcept<AlterableDigraphComponent<>, SmartDigraph>();
142 142
    checkConcept<ExtendableDigraphComponent<>, SmartDigraph>();
143 143
    checkConcept<ClearableDigraphComponent<>, SmartDigraph>();
144 144
  }
145
//  { // Checking FullDigraph
146
//    checkConcept<Digraph, FullDigraph>();
147
//  }
145
  { // Checking FullDigraph
146
    checkConcept<Digraph, FullDigraph>();
147
  }
148 148
//  { // Checking HyperCubeDigraph
149 149
//    checkConcept<Digraph, HyperCubeDigraph>();
150 150
//  }
151 151
}
152 152

	
153 153
template <typename Digraph>
0 comments (0 inline)