Changeset 1704:467d7927a901 in lemon-0.x for lemon/bits/undir_graph_extender.h
- Timestamp:
- 10/05/05 15:17:42 (19 years ago)
- Branch:
- default
- Phase:
- public
- Convert:
- svn:c9d7d8f5-90d6-0310-b91f-818b3a526b0e/lemon/trunk@2231
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
lemon/bits/undir_graph_extender.h
r1627 r1704 72 72 } 73 73 74 protected:75 76 template <typename E>77 Node _dirSource(const E &e) const {78 return e.forward ? Parent::source(e) : Parent::target(e);79 }80 81 template <typename E>82 Node _dirTarget(const E &e) const {83 return e.forward ? Parent::target(e) : Parent::source(e);84 }85 86 74 public: 87 75 /// \todo Shouldn't the "source" of an undirected edge be called "aNode" … … 91 79 /// Source of the given Edge. 92 80 Node source(const Edge &e) const { 93 return _dirSource(e);81 return e.forward ? Parent::source(e) : Parent::target(e); 94 82 } 95 83 … … 100 88 /// Target of the given Edge. 101 89 Node target(const Edge &e) const { 102 return _dirTarget(e);90 return e.forward ? Parent::target(e) : Parent::source(e); 103 91 } 104 92 … … 155 143 } 156 144 157 158 protected: 159 160 template <typename E> 161 void _dirFirstOut(E &e, const Node &n) const { 145 public: 146 147 void firstOut(Edge &e, const Node &n) const { 162 148 Parent::firstIn(e,n); 163 149 if( UndirEdge(e) != INVALID ) { … … 169 155 } 170 156 } 171 template <typename E> 172 void _dirFirstIn(E &e, const Node &n) const { 173 Parent::firstOut(e,n); 174 if( UndirEdge(e) != INVALID ) { 175 e.forward = false; 176 } 177 else { 178 Parent::firstIn(e,n); 179 e.forward = true; 180 } 181 } 182 183 template <typename E> 184 void _dirNextOut(E &e) const { 157 void nextOut(Edge &e) const { 185 158 if( ! e.forward ) { 186 159 Node n = Parent::target(e); … … 195 168 } 196 169 } 197 template <typename E> 198 void _dirNextIn(E &e) const { 170 171 void firstIn(Edge &e, const Node &n) const { 172 Parent::firstOut(e,n); 173 if( UndirEdge(e) != INVALID ) { 174 e.forward = false; 175 } 176 else { 177 Parent::firstIn(e,n); 178 e.forward = true; 179 } 180 } 181 void nextIn(Edge &e) const { 199 182 if( ! e.forward ) { 200 183 Node n = Parent::source(e); … … 210 193 } 211 194 212 public: 213 214 void firstOut(Edge &e, const Node &n) const { 215 _dirFirstOut(e, n); 216 } 217 void firstIn(Edge &e, const Node &n) const { 218 _dirFirstIn(e, n); 219 } 220 221 void nextOut(Edge &e) const { 222 _dirNextOut(e); 223 } 224 void nextIn(Edge &e) const { 225 _dirNextIn(e); 195 void firstInc(UndirEdge &e, const Node &n) const { 196 Parent::firstOut(e, n); 197 if (e != INVALID) return; 198 Parent::firstIn(e, n); 199 } 200 void nextInc(UndirEdge &e, const Node &n) const { 201 if (Parent::source(e) == n) { 202 Parent::nextOut(e); 203 if (e != INVALID) return; 204 Parent::firstIn(e, n); 205 } else { 206 Parent::nextIn(e); 207 } 208 } 209 210 void firstInc(UndirEdge &e, bool &d, const Node &n) const { 211 d = true; 212 Parent::firstOut(e, n); 213 if (e != INVALID) return; 214 d = false; 215 Parent::firstIn(e, n); 216 } 217 void nextInc(UndirEdge &e, bool &d) const { 218 if (d) { 219 Node s = Parent::source(e); 220 Parent::nextOut(e); 221 if (e != INVALID) return; 222 d = false; 223 Parent::firstIn(e, s); 224 } else { 225 Parent::nextIn(e); 226 } 226 227 } 227 228 … … 263 264 return 2 * Parent::edgeNum(); 264 265 } 266 265 267 int undirEdgeNum() const { 266 268 return Parent::edgeNum(); 267 269 } 268 270 271 Edge findEdge(Node source, Node target, Edge prev) const { 272 if (prev == INVALID) { 273 UndirEdge edge = Parent::findEdge(source, target); 274 if (edge != INVALID) return direct(edge, true); 275 edge = Parent::findEdge(target, source); 276 if (edge != INVALID) return direct(edge, false); 277 } else if (direction(prev)) { 278 UndirEdge edge = Parent::findEdge(source, target, prev); 279 if (edge != INVALID) return direct(edge, true); 280 edge = Parent::findEdge(target, source); 281 if (edge != INVALID) return direct(edge, false); 282 } else { 283 UndirEdge edge = Parent::findEdge(target, source, prev); 284 if (edge != INVALID) return direct(edge, false); 285 } 286 return INVALID; 287 } 288 289 UndirEdge findUndirEdge(Node source, Node target, UndirEdge prev) const { 290 if (prev == INVALID) { 291 UndirEdge edge = Parent::findEdge(source, target); 292 if (edge != INVALID) return edge; 293 edge = Parent::findEdge(target, source); 294 if (edge != INVALID) return edge; 295 } else if (Parent::source(prev) == source) { 296 UndirEdge edge = Parent::findEdge(source, target, prev); 297 if (edge != INVALID) return edge; 298 edge = Parent::findEdge(target, source); 299 if (edge != INVALID) return edge; 300 } else { 301 UndirEdge edge = Parent::findEdge(target, source, prev); 302 if (edge != INVALID) return edge; 303 } 304 return INVALID; 305 } 306 269 307 }; 270 308
Note: See TracChangeset
for help on using the changeset viewer.