# HG changeset patch
# User Peter Kovacs <kpeter@inf.elte.hu>
# Date 1250789004 -7200
# Node ID 63ba9934ba2f04e2107383ad15af578ace45e5b8
# Parent eb8f6284708adfe6ee61f7d457b73cf59499d750
Much better implementation for node splitting (#311)
in ListDigraph. This solution is the same as the one that
is used in SmartDigraph. It is much faster and does not
invalidate any iterators like the former implementation.
diff --git a/lemon/list_graph.h b/lemon/list_graph.h
|
a
|
b
|
|
| 32 | 32 | |
| 33 | 33 | namespace lemon { |
| 34 | 34 | |
| | 35 | class ListDigraph; |
| | 36 | |
| 35 | 37 | class ListDigraphBase { |
| 36 | 38 | |
| 37 | 39 | protected: |
| … |
… |
|
| 62 | 64 | |
| 63 | 65 | class Node { |
| 64 | 66 | friend class ListDigraphBase; |
| | 67 | friend class ListDigraph; |
| 65 | 68 | protected: |
| 66 | 69 | |
| 67 | 70 | int id; |
| … |
… |
|
| 77 | 80 | |
| 78 | 81 | class Arc { |
| 79 | 82 | friend class ListDigraphBase; |
| | 83 | friend class ListDigraph; |
| 80 | 84 | protected: |
| 81 | 85 | |
| 82 | 86 | int id; |
| … |
… |
|
| 467 | 471 | ///is also added. |
| 468 | 472 | ///\return The newly created node. |
| 469 | 473 | /// |
| 470 | | ///\note \c ArcIt and \c OutArcIt iterators referencing the outgoing |
| 471 | | ///arcs of node \c n are invalidated. Other iterators remain valid. |
| | 474 | ///\note All iterators remain valid. |
| 472 | 475 | /// |
| 473 | 476 | ///\warning This functionality cannot be used together with the |
| 474 | 477 | ///Snapshot feature. |
| 475 | 478 | Node split(Node n, bool connect = true) { |
| 476 | 479 | Node b = addNode(); |
| 477 | | for(OutArcIt e(*this,n);e!=INVALID;) { |
| 478 | | OutArcIt f=e; |
| 479 | | ++f; |
| 480 | | changeSource(e,b); |
| 481 | | e=f; |
| | 480 | nodes[b.id].first_out=nodes[n.id].first_out; |
| | 481 | nodes[n.id].first_out=-1; |
| | 482 | for(int i=nodes[b.id].first_out; i!=-1; i=arcs[i].next_out) { |
| | 483 | arcs[i].source=b.id; |
| 482 | 484 | } |
| 483 | 485 | if (connect) addArc(n,b); |
| 484 | 486 | return b; |