# HG changeset patch
# User Peter Kovacs <kpeter@inf.elte.hu>
# Date 1251216059 -7200
# Node ID a3de05c56e7e87f6c030016f32ba7ef664519f70
# Parent 6cab2ab9d8e7df5a77ddbadbb4dabb920f9a913e
Remove the outgoing arc list from StaticDigraph (#68)
to save one int value for each arc.
The list was used only by the basic iteration interface, i.e.
the nextOut(Arc&) function, but it can be implemented easily
and efficiently without the outgoing arc list, as well.
diff --git a/lemon/static_graph.h b/lemon/static_graph.h
|
a
|
b
|
|
| 34 | 34 | StaticDigraphBase() |
| 35 | 35 | : built(false), node_num(0), arc_num(0), |
| 36 | 36 | node_first_out(NULL), node_first_in(NULL), |
| 37 | | arc_source(NULL), arc_target(NULL), |
| 38 | | arc_next_in(NULL), arc_next_out(NULL) {} |
| | 37 | arc_source(NULL), arc_target(NULL), arc_next_in(NULL) {} |
| 39 | 38 | |
| 40 | 39 | ~StaticDigraphBase() { |
| 41 | 40 | if (built) { |
| … |
… |
|
| 43 | 42 | delete[] node_first_in; |
| 44 | 43 | delete[] arc_source; |
| 45 | 44 | delete[] arc_target; |
| 46 | | delete[] arc_next_out; |
| 47 | 45 | delete[] arc_next_in; |
| 48 | 46 | } |
| 49 | 47 | } |
| … |
… |
|
| 87 | 85 | e.id = node_first_out[n.id] != node_first_out[n.id + 1] ? |
| 88 | 86 | node_first_out[n.id] : -1; |
| 89 | 87 | } |
| 90 | | void nextOut(Arc& e) const { e.id = arc_next_out[e.id]; } |
| | 88 | void nextOut(Arc& e) const { |
| | 89 | e.id = e.id + 1 != node_first_out[arc_source[e.id] + 1] ? |
| | 90 | e.id + 1 : -1; |
| | 91 | } |
| 91 | 92 | |
| 92 | 93 | void firstIn(Arc& e, const Node& n) const { e.id = node_first_in[n.id]; } |
| 93 | 94 | void nextIn(Arc& e) const { e.id = arc_next_in[e.id]; } |
| … |
… |
|
| 134 | 135 | delete[] node_first_in; |
| 135 | 136 | delete[] arc_source; |
| 136 | 137 | delete[] arc_target; |
| 137 | | delete[] arc_next_out; |
| 138 | 138 | delete[] arc_next_in; |
| 139 | 139 | } |
| 140 | 140 | built = false; |
| … |
… |
|
| 157 | 157 | |
| 158 | 158 | arc_source = new int[arc_num]; |
| 159 | 159 | arc_target = new int[arc_num]; |
| 160 | | arc_next_out = new int[arc_num]; |
| 161 | 160 | arc_next_in = new int[arc_num]; |
| 162 | 161 | |
| 163 | 162 | int node_index = 0; |
| … |
… |
|
| 187 | 186 | arc_target[arc_index] = target; |
| 188 | 187 | arc_next_in[arc_index] = node_first_in[target]; |
| 189 | 188 | node_first_in[target] = arc_index; |
| 190 | | arc_next_out[arc_index] = arc_index + 1; |
| 191 | 189 | ++arc_index; |
| 192 | 190 | } |
| 193 | | arc_next_out[arc_index - 1] = -1; |
| 194 | 191 | } else { |
| 195 | 192 | node_first_out[source] = arc_index; |
| 196 | 193 | } |
| … |
… |
|
| 220 | 217 | int *arc_source; |
| 221 | 218 | int *arc_target; |
| 222 | 219 | int *arc_next_in; |
| 223 | | int *arc_next_out; |
| 224 | 220 | }; |
| 225 | 221 | |
| 226 | 222 | typedef DigraphExtender<StaticDigraphBase> ExtendedStaticDigraphBase; |
| … |
… |
|
| 232 | 228 | /// |
| 233 | 229 | /// \ref StaticDigraph is a highly efficient digraph implementation, |
| 234 | 230 | /// but it is fully static. |
| 235 | | /// It stores only two \c int values for each node and only four \c int |
| | 231 | /// It stores only two \c int values for each node and only three \c int |
| 236 | 232 | /// values for each arc. Moreover it provides faster item iteration than |
| 237 | 233 | /// \ref ListDigraph and \ref SmartDigraph, especially using \c OutArcIt |
| 238 | 234 | /// iterators, since its arcs are stored in an appropriate order. |