1 /* -*- C++ -*- |
1 /* -*- mode: C++; indent-tabs-mode: nil; -*- |
2 * |
2 * |
3 * This file is a part of LEMON, a generic C++ optimization library |
3 * This file is a part of LEMON, a generic C++ optimization library. |
4 * |
4 * |
5 * Copyright (C) 2003-2008 |
5 * Copyright (C) 2003-2008 |
6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 * (Egervary Research Group on Combinatorial Optimization, EGRES). |
7 * (Egervary Research Group on Combinatorial Optimization, EGRES). |
8 * |
8 * |
51 |
51 |
52 class RevArcIt { |
52 class RevArcIt { |
53 public: |
53 public: |
54 RevArcIt() {} |
54 RevArcIt() {} |
55 RevArcIt(Invalid) : path(0), current(INVALID) {} |
55 RevArcIt(Invalid) : path(0), current(INVALID) {} |
56 RevArcIt(const PredMapPath& _path) |
56 RevArcIt(const PredMapPath& _path) |
57 : path(&_path), current(_path.target) { |
57 : path(&_path), current(_path.target) { |
58 if (path->predMap[current] == INVALID) current = INVALID; |
58 if (path->predMap[current] == INVALID) current = INVALID; |
59 } |
59 } |
60 |
60 |
61 operator const typename Digraph::Arc() const { |
61 operator const typename Digraph::Arc() const { |
66 current = path->digraph.source(path->predMap[current]); |
66 current = path->digraph.source(path->predMap[current]); |
67 if (path->predMap[current] == INVALID) current = INVALID; |
67 if (path->predMap[current] == INVALID) current = INVALID; |
68 return *this; |
68 return *this; |
69 } |
69 } |
70 |
70 |
71 bool operator==(const RevArcIt& e) const { |
71 bool operator==(const RevArcIt& e) const { |
72 return current == e.current; |
72 return current == e.current; |
73 } |
73 } |
74 |
74 |
75 bool operator!=(const RevArcIt& e) const { |
75 bool operator!=(const RevArcIt& e) const { |
76 return current != e.current; |
76 return current != e.current; |
77 } |
77 } |
78 |
78 |
79 bool operator<(const RevArcIt& e) const { |
79 bool operator<(const RevArcIt& e) const { |
80 return current < e.current; |
80 return current < e.current; |
81 } |
81 } |
82 |
82 |
83 private: |
83 private: |
84 const PredMapPath* path; |
84 const PredMapPath* path; |
85 typename Digraph::Node current; |
85 typename Digraph::Node current; |
86 }; |
86 }; |
87 |
87 |
99 |
99 |
100 typedef _Digraph Digraph; |
100 typedef _Digraph Digraph; |
101 typedef typename Digraph::Arc Arc; |
101 typedef typename Digraph::Arc Arc; |
102 typedef _PredMatrixMap PredMatrixMap; |
102 typedef _PredMatrixMap PredMatrixMap; |
103 |
103 |
104 PredMatrixMapPath(const Digraph& _digraph, |
104 PredMatrixMapPath(const Digraph& _digraph, |
105 const PredMatrixMap& _predMatrixMap, |
105 const PredMatrixMap& _predMatrixMap, |
106 typename Digraph::Node _source, |
106 typename Digraph::Node _source, |
107 typename Digraph::Node _target) |
107 typename Digraph::Node _target) |
108 : digraph(_digraph), predMatrixMap(_predMatrixMap), |
108 : digraph(_digraph), predMatrixMap(_predMatrixMap), |
109 source(_source), target(_target) {} |
109 source(_source), target(_target) {} |
110 |
110 |
111 int length() const { |
111 int length() const { |
112 int len = 0; |
112 int len = 0; |
113 typename Digraph::Node node = target; |
113 typename Digraph::Node node = target; |
125 |
125 |
126 class RevArcIt { |
126 class RevArcIt { |
127 public: |
127 public: |
128 RevArcIt() {} |
128 RevArcIt() {} |
129 RevArcIt(Invalid) : path(0), current(INVALID) {} |
129 RevArcIt(Invalid) : path(0), current(INVALID) {} |
130 RevArcIt(const PredMatrixMapPath& _path) |
130 RevArcIt(const PredMatrixMapPath& _path) |
131 : path(&_path), current(_path.target) { |
131 : path(&_path), current(_path.target) { |
132 if (path->predMatrixMap(path->source, current) == INVALID) |
132 if (path->predMatrixMap(path->source, current) == INVALID) |
133 current = INVALID; |
133 current = INVALID; |
134 } |
134 } |
135 |
135 |
136 operator const typename Digraph::Arc() const { |
136 operator const typename Digraph::Arc() const { |
137 return path->predMatrixMap(path->source, current); |
137 return path->predMatrixMap(path->source, current); |
138 } |
138 } |
139 |
139 |
140 RevArcIt& operator++() { |
140 RevArcIt& operator++() { |
141 current = |
141 current = |
142 path->digraph.source(path->predMatrixMap(path->source, current)); |
142 path->digraph.source(path->predMatrixMap(path->source, current)); |
143 if (path->predMatrixMap(path->source, current) == INVALID) |
143 if (path->predMatrixMap(path->source, current) == INVALID) |
144 current = INVALID; |
144 current = INVALID; |
145 return *this; |
145 return *this; |
146 } |
146 } |
147 |
147 |
148 bool operator==(const RevArcIt& e) const { |
148 bool operator==(const RevArcIt& e) const { |
149 return current == e.current; |
149 return current == e.current; |
150 } |
150 } |
151 |
151 |
152 bool operator!=(const RevArcIt& e) const { |
152 bool operator!=(const RevArcIt& e) const { |
153 return current != e.current; |
153 return current != e.current; |
154 } |
154 } |
155 |
155 |
156 bool operator<(const RevArcIt& e) const { |
156 bool operator<(const RevArcIt& e) const { |
157 return current < e.current; |
157 return current < e.current; |
158 } |
158 } |
159 |
159 |
160 private: |
160 private: |
161 const PredMatrixMapPath* path; |
161 const PredMatrixMapPath* path; |
162 typename Digraph::Node current; |
162 typename Digraph::Node current; |
163 }; |
163 }; |
164 |
164 |