Changeset 1703:eb90e3d6bddc in lemon-0.x for lemon/full_graph.h
- Timestamp:
- 10/05/05 15:15:47 (19 years ago)
- Branch:
- default
- Phase:
- public
- Convert:
- svn:c9d7d8f5-90d6-0310-b91f-818b3a526b0e/lemon/trunk@2230
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
lemon/full_graph.h
r1692 r1703 23 23 #include <lemon/bits/iterable_graph_extender.h> 24 24 #include <lemon/bits/alteration_notifier.h> 25 #include <lemon/bits/ default_map.h>25 #include <lemon/bits/static_map.h> 26 26 27 27 #include <lemon/bits/undir_graph_extender.h> … … 196 196 typedef IterableGraphExtender<AlterableFullGraphBase> 197 197 IterableFullGraphBase; 198 typedef MappableGraphExtender<198 typedef StaticMappableGraphExtender< 199 199 IterableGraphExtender< 200 200 AlterableGraphExtender<FullGraphBase> > > ExtendedFullGraphBase; … … 299 299 /// the next edge from \c u to \c v after \c prev. 300 300 /// \return The found edge or INVALID if there is no such an edge. 301 Edge findEdge(Node u,Node v, Edge prev = INVALID) 302 { 303 return prev.id == -1 ? Edge(*this, u.id, v.id) : INVALID; 304 } 301 Edge findEdge(Node u, Node v, Edge prev = INVALID) const { 302 if (prev.id != -1 || u.id <= v.id) return -1; 303 return Edge(u.id * (u.id - 1) / 2 + v.id); 304 } 305 306 typedef True FindEdgeTag; 305 307 306 308 … … 329 331 Edge(int _id) : id(_id) {} 330 332 331 Edge(const UndirFullGraphBase& _graph, int source, int target)332 : id(_graph._nodeNum * target+source) {}333 333 public: 334 334 Edge() { } … … 340 340 341 341 void first(Node& node) const { 342 node.id = _nodeNum -1;342 node.id = _nodeNum - 1; 343 343 } 344 344 … … 348 348 349 349 void first(Edge& edge) const { 350 edge.id = _edgeNum -1;350 edge.id = _edgeNum - 1; 351 351 } 352 352 … … 356 356 357 357 void firstOut(Edge& edge, const Node& node) const { 358 edge.id = node.id != 0 ? node.id * (node.id - 1) / 2 : -1; 358 int src = node.id; 359 int trg = 0; 360 edge.id = (trg < src ? src * (src - 1) / 2 + trg : -1); 359 361 } 360 362 361 363 /// \todo with specialized iterators we can make faster iterating 362 void nextOut(Edge& e ) const {363 int s ource = ((int)sqrt((double)(1 + 8 * e.id)) + 1) / 2;;364 int t arget = e.id - (source) * (source - 1) / 2;365 ++t arget;366 e .id = target < source ? source * (source - 1) / 2 + target : -1;364 void nextOut(Edge& edge) const { 365 int src = source(edge).id; 366 int trg = target(edge).id; 367 ++trg; 368 edge.id = (trg < src ? src * (src - 1) / 2 + trg : -1); 367 369 } 368 370 369 371 void firstIn(Edge& edge, const Node& node) const { 370 edge.id = node.id * (node.id + 1) / 2 - 1; 371 } 372 373 void nextIn(Edge& e) const { 374 int source = ((int)sqrt((double)(1 + 8 * e.id)) + 1) / 2;; 375 int target = e.id - (source) * (source - 1) / 2; ++target; 376 ++source; 377 e.id = source < _nodeNum ? source * (source - 1) / 2 + target : -1; 372 int src = node.id + 1; 373 int trg = node.id; 374 edge.id = (src < _nodeNum ? src * (src - 1) / 2 + trg : -1); 375 } 376 377 void nextIn(Edge& edge) const { 378 int src = source(edge).id; 379 int trg = target(edge).id; 380 ++src; 381 edge.id = (src < _nodeNum ? src * (src - 1) / 2 + trg : -1); 378 382 } 379 383 380 384 }; 381 385 382 typedef MappableUndirGraphExtender<386 typedef StaticMappableUndirGraphExtender< 383 387 IterableUndirGraphExtender< 384 388 AlterableUndirGraphExtender<
Note: See TracChangeset
for help on using the changeset viewer.