marci@281
|
1 |
// -*- c++ -*-
|
marci@281
|
2 |
#ifndef HUGO_BFS_ITERATOR_H
|
marci@281
|
3 |
#define HUGO_BFS_ITERATOR_H
|
marci@281
|
4 |
|
marci@281
|
5 |
#include <queue>
|
marci@281
|
6 |
#include <stack>
|
marci@281
|
7 |
#include <utility>
|
marci@281
|
8 |
#include <graph_wrapper_1.h>
|
marci@281
|
9 |
|
marci@281
|
10 |
namespace hugo {
|
marci@281
|
11 |
|
marci@281
|
12 |
// template <typename Graph>
|
marci@281
|
13 |
// struct bfs {
|
marci@281
|
14 |
// typedef typename Graph::Node Node;
|
marci@281
|
15 |
// typedef typename Graph::Edge Edge;
|
marci@281
|
16 |
// typedef typename Graph::NodeIt NodeIt;
|
marci@281
|
17 |
// typedef typename Graph::OutEdgeIt OutEdgeIt;
|
marci@281
|
18 |
// Graph& G;
|
marci@281
|
19 |
// Node s;
|
marci@281
|
20 |
// typename Graph::NodeMap<bool> reached;
|
marci@281
|
21 |
// typename Graph::NodeMap<Edge> pred;
|
marci@281
|
22 |
// typename Graph::NodeMap<int> dist;
|
marci@281
|
23 |
// std::queue<Node> bfs_queue;
|
marci@281
|
24 |
// bfs(Graph& _G, Node _s) : G(_G), s(_s), reached(_G), pred(_G), dist(_G) {
|
marci@281
|
25 |
// bfs_queue.push(s);
|
marci@281
|
26 |
// for(NodeIt i=G.template first<NodeIt>(); i.valid(); ++i)
|
marci@281
|
27 |
// reached.set(i, false);
|
marci@281
|
28 |
// reached.set(s, true);
|
marci@281
|
29 |
// dist.set(s, 0);
|
marci@281
|
30 |
// }
|
marci@281
|
31 |
|
marci@281
|
32 |
// void run() {
|
marci@281
|
33 |
// while (!bfs_queue.empty()) {
|
marci@281
|
34 |
// Node v=bfs_queue.front();
|
marci@281
|
35 |
// OutEdgeIt e=G.template first<OutEdgeIt>(v);
|
marci@281
|
36 |
// bfs_queue.pop();
|
marci@281
|
37 |
// for( ; e.valid(); ++e) {
|
marci@281
|
38 |
// Node w=G.bNode(e);
|
marci@281
|
39 |
// std::cout << "scan node " << G.id(w) << " from node " << G.id(v) << std::endl;
|
marci@281
|
40 |
// if (!reached.get(w)) {
|
marci@281
|
41 |
// std::cout << G.id(w) << " is newly reached :-)" << std::endl;
|
marci@281
|
42 |
// bfs_queue.push(w);
|
marci@281
|
43 |
// dist.set(w, dist.get(v)+1);
|
marci@281
|
44 |
// pred.set(w, e);
|
marci@281
|
45 |
// reached.set(w, true);
|
marci@281
|
46 |
// } else {
|
marci@281
|
47 |
// std::cout << G.id(w) << " is already reached" << std::endl;
|
marci@281
|
48 |
// }
|
marci@281
|
49 |
// }
|
marci@281
|
50 |
// }
|
marci@281
|
51 |
// }
|
marci@281
|
52 |
// };
|
marci@281
|
53 |
|
marci@281
|
54 |
// template <typename Graph>
|
marci@281
|
55 |
// struct bfs_visitor {
|
marci@281
|
56 |
// typedef typename Graph::Node Node;
|
marci@281
|
57 |
// typedef typename Graph::Edge Edge;
|
marci@281
|
58 |
// typedef typename Graph::OutEdgeIt OutEdgeIt;
|
marci@281
|
59 |
// Graph& G;
|
marci@281
|
60 |
// bfs_visitor(Graph& _G) : G(_G) { }
|
marci@281
|
61 |
// void at_previously_reached(OutEdgeIt& e) {
|
marci@281
|
62 |
// //Node v=G.aNode(e);
|
marci@281
|
63 |
// Node w=G.bNode(e);
|
marci@281
|
64 |
// std::cout << G.id(w) << " is already reached" << std::endl;
|
marci@281
|
65 |
// }
|
marci@281
|
66 |
// void at_newly_reached(OutEdgeIt& e) {
|
marci@281
|
67 |
// //Node v=G.aNode(e);
|
marci@281
|
68 |
// Node w=G.bNode(e);
|
marci@281
|
69 |
// std::cout << G.id(w) << " is newly reached :-)" << std::endl;
|
marci@281
|
70 |
// }
|
marci@281
|
71 |
// };
|
marci@281
|
72 |
|
marci@281
|
73 |
// template <typename Graph, typename ReachedMap, typename visitor_type>
|
marci@281
|
74 |
// struct bfs_iterator {
|
marci@281
|
75 |
// typedef typename Graph::Node Node;
|
marci@281
|
76 |
// typedef typename Graph::Edge Edge;
|
marci@281
|
77 |
// typedef typename Graph::OutEdgeIt OutEdgeIt;
|
marci@281
|
78 |
// Graph& G;
|
marci@281
|
79 |
// std::queue<OutEdgeIt>& bfs_queue;
|
marci@281
|
80 |
// ReachedMap& reached;
|
marci@281
|
81 |
// visitor_type& visitor;
|
marci@281
|
82 |
// void process() {
|
marci@281
|
83 |
// while ( !bfs_queue.empty() && !bfs_queue.front().valid() ) { bfs_queue.pop(); }
|
marci@281
|
84 |
// if (bfs_queue.empty()) return;
|
marci@281
|
85 |
// OutEdgeIt e=bfs_queue.front();
|
marci@281
|
86 |
// //Node v=G.aNode(e);
|
marci@281
|
87 |
// Node w=G.bNode(e);
|
marci@281
|
88 |
// if (!reached.get(w)) {
|
marci@281
|
89 |
// visitor.at_newly_reached(e);
|
marci@281
|
90 |
// bfs_queue.push(G.template first<OutEdgeIt>(w));
|
marci@281
|
91 |
// reached.set(w, true);
|
marci@281
|
92 |
// } else {
|
marci@281
|
93 |
// visitor.at_previously_reached(e);
|
marci@281
|
94 |
// }
|
marci@281
|
95 |
// }
|
marci@281
|
96 |
// bfs_iterator(Graph& _G, std::queue<OutEdgeIt>& _bfs_queue, ReachedMap& _reached, visitor_type& _visitor) : G(_G), bfs_queue(_bfs_queue), reached(_reached), visitor(_visitor) {
|
marci@281
|
97 |
// //while ( !bfs_queue.empty() && !bfs_queue.front().valid() ) { bfs_queue.pop(); }
|
marci@281
|
98 |
// valid();
|
marci@281
|
99 |
// }
|
marci@281
|
100 |
// bfs_iterator<Graph, ReachedMap, visitor_type>& operator++() {
|
marci@281
|
101 |
// //while ( !bfs_queue.empty() && !bfs_queue.front().valid() ) { bfs_queue.pop(); }
|
marci@281
|
102 |
// //if (bfs_queue.empty()) return *this;
|
marci@281
|
103 |
// if (!valid()) return *this;
|
marci@281
|
104 |
// ++(bfs_queue.front());
|
marci@281
|
105 |
// //while ( !bfs_queue.empty() && !bfs_queue.front().valid() ) { bfs_queue.pop(); }
|
marci@281
|
106 |
// valid();
|
marci@281
|
107 |
// return *this;
|
marci@281
|
108 |
// }
|
marci@281
|
109 |
// //void next() {
|
marci@281
|
110 |
// // while ( !bfs_queue.empty() && !bfs_queue.front().valid() ) { bfs_queue.pop(); }
|
marci@281
|
111 |
// // if (bfs_queue.empty()) return;
|
marci@281
|
112 |
// // ++(bfs_queue.front());
|
marci@281
|
113 |
// // while ( !bfs_queue.empty() && !bfs_queue.front().valid() ) { bfs_queue.pop(); }
|
marci@281
|
114 |
// //}
|
marci@281
|
115 |
// bool valid() {
|
marci@281
|
116 |
// while ( !bfs_queue.empty() && !bfs_queue.front().valid() ) { bfs_queue.pop(); }
|
marci@281
|
117 |
// if (bfs_queue.empty()) return false; else return true;
|
marci@281
|
118 |
// }
|
marci@281
|
119 |
// //bool finished() {
|
marci@281
|
120 |
// // while ( !bfs_queue.empty() && !bfs_queue.front().valid() ) { bfs_queue.pop(); }
|
marci@281
|
121 |
// // if (bfs_queue.empty()) return true; else return false;
|
marci@281
|
122 |
// //}
|
marci@281
|
123 |
// operator Edge () { return bfs_queue.front(); }
|
marci@281
|
124 |
|
marci@281
|
125 |
// };
|
marci@281
|
126 |
|
marci@281
|
127 |
// template <typename Graph, typename ReachedMap>
|
marci@281
|
128 |
// struct bfs_iterator1 {
|
marci@281
|
129 |
// typedef typename Graph::Node Node;
|
marci@281
|
130 |
// typedef typename Graph::Edge Edge;
|
marci@281
|
131 |
// typedef typename Graph::OutEdgeIt OutEdgeIt;
|
marci@281
|
132 |
// Graph& G;
|
marci@281
|
133 |
// std::queue<OutEdgeIt>& bfs_queue;
|
marci@281
|
134 |
// ReachedMap& reached;
|
marci@281
|
135 |
// bool _newly_reached;
|
marci@281
|
136 |
// bfs_iterator1(Graph& _G, std::queue<OutEdgeIt>& _bfs_queue, ReachedMap& _reached) : G(_G), bfs_queue(_bfs_queue), reached(_reached) {
|
marci@281
|
137 |
// valid();
|
marci@281
|
138 |
// if (!bfs_queue.empty() && bfs_queue.front().valid()) {
|
marci@281
|
139 |
// OutEdgeIt e=bfs_queue.front();
|
marci@281
|
140 |
// Node w=G.bNode(e);
|
marci@281
|
141 |
// if (!reached.get(w)) {
|
marci@281
|
142 |
// bfs_queue.push(G.template first<OutEdgeIt>(w));
|
marci@281
|
143 |
// reached.set(w, true);
|
marci@281
|
144 |
// _newly_reached=true;
|
marci@281
|
145 |
// } else {
|
marci@281
|
146 |
// _newly_reached=false;
|
marci@281
|
147 |
// }
|
marci@281
|
148 |
// }
|
marci@281
|
149 |
// }
|
marci@281
|
150 |
// bfs_iterator1<Graph, ReachedMap>& operator++() {
|
marci@281
|
151 |
// if (!valid()) return *this;
|
marci@281
|
152 |
// ++(bfs_queue.front());
|
marci@281
|
153 |
// valid();
|
marci@281
|
154 |
// if (!bfs_queue.empty() && bfs_queue.front().valid()) {
|
marci@281
|
155 |
// OutEdgeIt e=bfs_queue.front();
|
marci@281
|
156 |
// Node w=G.bNode(e);
|
marci@281
|
157 |
// if (!reached.get(w)) {
|
marci@281
|
158 |
// bfs_queue.push(G.template first<OutEdgeIt>(w));
|
marci@281
|
159 |
// reached.set(w, true);
|
marci@281
|
160 |
// _newly_reached=true;
|
marci@281
|
161 |
// } else {
|
marci@281
|
162 |
// _newly_reached=false;
|
marci@281
|
163 |
// }
|
marci@281
|
164 |
// }
|
marci@281
|
165 |
// return *this;
|
marci@281
|
166 |
// }
|
marci@281
|
167 |
// bool valid() {
|
marci@281
|
168 |
// while ( !bfs_queue.empty() && !bfs_queue.front().valid() ) { bfs_queue.pop(); }
|
marci@281
|
169 |
// if (bfs_queue.empty()) return false; else return true;
|
marci@281
|
170 |
// }
|
marci@281
|
171 |
// operator OutEdgeIt() { return bfs_queue.front(); }
|
marci@281
|
172 |
// //ize
|
marci@281
|
173 |
// bool newly_reached() { return _newly_reached; }
|
marci@281
|
174 |
|
marci@281
|
175 |
// };
|
marci@281
|
176 |
|
marci@281
|
177 |
// template <typename Graph, typename OutEdgeIt, typename ReachedMap>
|
marci@281
|
178 |
// struct BfsIterator {
|
marci@281
|
179 |
// typedef typename Graph::Node Node;
|
marci@281
|
180 |
// Graph& G;
|
marci@281
|
181 |
// std::queue<OutEdgeIt>& bfs_queue;
|
marci@281
|
182 |
// ReachedMap& reached;
|
marci@281
|
183 |
// bool b_node_newly_reached;
|
marci@281
|
184 |
// OutEdgeIt actual_edge;
|
marci@281
|
185 |
// BfsIterator(Graph& _G,
|
marci@281
|
186 |
// std::queue<OutEdgeIt>& _bfs_queue,
|
marci@281
|
187 |
// ReachedMap& _reached) :
|
marci@281
|
188 |
// G(_G), bfs_queue(_bfs_queue), reached(_reached) {
|
marci@281
|
189 |
// actual_edge=bfs_queue.front();
|
marci@281
|
190 |
// if (actual_edge.valid()) {
|
marci@281
|
191 |
// Node w=G.bNode(actual_edge);
|
marci@281
|
192 |
// if (!reached.get(w)) {
|
marci@281
|
193 |
// bfs_queue.push(G.firstOutEdge(w));
|
marci@281
|
194 |
// reached.set(w, true);
|
marci@281
|
195 |
// b_node_newly_reached=true;
|
marci@281
|
196 |
// } else {
|
marci@281
|
197 |
// b_node_newly_reached=false;
|
marci@281
|
198 |
// }
|
marci@281
|
199 |
// }
|
marci@281
|
200 |
// }
|
marci@281
|
201 |
// BfsIterator<Graph, OutEdgeIt, ReachedMap>&
|
marci@281
|
202 |
// operator++() {
|
marci@281
|
203 |
// if (bfs_queue.front().valid()) {
|
marci@281
|
204 |
// ++(bfs_queue.front());
|
marci@281
|
205 |
// actual_edge=bfs_queue.front();
|
marci@281
|
206 |
// if (actual_edge.valid()) {
|
marci@281
|
207 |
// Node w=G.bNode(actual_edge);
|
marci@281
|
208 |
// if (!reached.get(w)) {
|
marci@281
|
209 |
// bfs_queue.push(G.firstOutEdge(w));
|
marci@281
|
210 |
// reached.set(w, true);
|
marci@281
|
211 |
// b_node_newly_reached=true;
|
marci@281
|
212 |
// } else {
|
marci@281
|
213 |
// b_node_newly_reached=false;
|
marci@281
|
214 |
// }
|
marci@281
|
215 |
// }
|
marci@281
|
216 |
// } else {
|
marci@281
|
217 |
// bfs_queue.pop();
|
marci@281
|
218 |
// actual_edge=bfs_queue.front();
|
marci@281
|
219 |
// if (actual_edge.valid()) {
|
marci@281
|
220 |
// Node w=G.bNode(actual_edge);
|
marci@281
|
221 |
// if (!reached.get(w)) {
|
marci@281
|
222 |
// bfs_queue.push(G.firstOutEdge(w));
|
marci@281
|
223 |
// reached.set(w, true);
|
marci@281
|
224 |
// b_node_newly_reached=true;
|
marci@281
|
225 |
// } else {
|
marci@281
|
226 |
// b_node_newly_reached=false;
|
marci@281
|
227 |
// }
|
marci@281
|
228 |
// }
|
marci@281
|
229 |
// }
|
marci@281
|
230 |
// return *this;
|
marci@281
|
231 |
// }
|
marci@281
|
232 |
// bool finished() { return bfs_queue.empty(); }
|
marci@281
|
233 |
// operator OutEdgeIt () { return actual_edge; }
|
marci@281
|
234 |
// bool bNodeIsNewlyReached() { return b_node_newly_reached; }
|
marci@281
|
235 |
// bool aNodeIsExamined() { return !(actual_edge.valid()); }
|
marci@281
|
236 |
// };
|
marci@281
|
237 |
|
marci@281
|
238 |
|
marci@281
|
239 |
// template <typename Graph, typename OutEdgeIt, typename ReachedMap>
|
marci@281
|
240 |
// struct DfsIterator {
|
marci@281
|
241 |
// typedef typename Graph::Node Node;
|
marci@281
|
242 |
// Graph& G;
|
marci@281
|
243 |
// std::stack<OutEdgeIt>& bfs_queue;
|
marci@281
|
244 |
// ReachedMap& reached;
|
marci@281
|
245 |
// bool b_node_newly_reached;
|
marci@281
|
246 |
// OutEdgeIt actual_edge;
|
marci@281
|
247 |
// DfsIterator(Graph& _G,
|
marci@281
|
248 |
// std::stack<OutEdgeIt>& _bfs_queue,
|
marci@281
|
249 |
// ReachedMap& _reached) :
|
marci@281
|
250 |
// G(_G), bfs_queue(_bfs_queue), reached(_reached) {
|
marci@281
|
251 |
// actual_edge=bfs_queue.top();
|
marci@281
|
252 |
// if (actual_edge.valid()) {
|
marci@281
|
253 |
// Node w=G.bNode(actual_edge);
|
marci@281
|
254 |
// if (!reached.get(w)) {
|
marci@281
|
255 |
// bfs_queue.push(G.firstOutEdge(w));
|
marci@281
|
256 |
// reached.set(w, true);
|
marci@281
|
257 |
// b_node_newly_reached=true;
|
marci@281
|
258 |
// } else {
|
marci@281
|
259 |
// ++(bfs_queue.top());
|
marci@281
|
260 |
// b_node_newly_reached=false;
|
marci@281
|
261 |
// }
|
marci@281
|
262 |
// } else {
|
marci@281
|
263 |
// bfs_queue.pop();
|
marci@281
|
264 |
// }
|
marci@281
|
265 |
// }
|
marci@281
|
266 |
// DfsIterator<Graph, OutEdgeIt, ReachedMap>&
|
marci@281
|
267 |
// operator++() {
|
marci@281
|
268 |
// actual_edge=bfs_queue.top();
|
marci@281
|
269 |
// if (actual_edge.valid()) {
|
marci@281
|
270 |
// Node w=G.bNode(actual_edge);
|
marci@281
|
271 |
// if (!reached.get(w)) {
|
marci@281
|
272 |
// bfs_queue.push(G.firstOutEdge(w));
|
marci@281
|
273 |
// reached.set(w, true);
|
marci@281
|
274 |
// b_node_newly_reached=true;
|
marci@281
|
275 |
// } else {
|
marci@281
|
276 |
// ++(bfs_queue.top());
|
marci@281
|
277 |
// b_node_newly_reached=false;
|
marci@281
|
278 |
// }
|
marci@281
|
279 |
// } else {
|
marci@281
|
280 |
// bfs_queue.pop();
|
marci@281
|
281 |
// }
|
marci@281
|
282 |
// return *this;
|
marci@281
|
283 |
// }
|
marci@281
|
284 |
// bool finished() { return bfs_queue.empty(); }
|
marci@281
|
285 |
// operator OutEdgeIt () { return actual_edge; }
|
marci@281
|
286 |
// bool bNodeIsNewlyReached() { return b_node_newly_reached; }
|
marci@281
|
287 |
// bool aNodeIsExamined() { return !(actual_edge.valid()); }
|
marci@281
|
288 |
// };
|
marci@281
|
289 |
|
marci@281
|
290 |
// template <typename Graph, typename OutEdgeIt, typename ReachedMap>
|
marci@281
|
291 |
// struct BfsIterator1 {
|
marci@281
|
292 |
// typedef typename Graph::Node Node;
|
marci@281
|
293 |
// Graph& G;
|
marci@281
|
294 |
// std::queue<OutEdgeIt>& bfs_queue;
|
marci@281
|
295 |
// ReachedMap& reached;
|
marci@281
|
296 |
// bool b_node_newly_reached;
|
marci@281
|
297 |
// OutEdgeIt actual_edge;
|
marci@281
|
298 |
// BfsIterator1(Graph& _G,
|
marci@281
|
299 |
// std::queue<OutEdgeIt>& _bfs_queue,
|
marci@281
|
300 |
// ReachedMap& _reached) :
|
marci@281
|
301 |
// G(_G), bfs_queue(_bfs_queue), reached(_reached) {
|
marci@281
|
302 |
// actual_edge=bfs_queue.front();
|
marci@281
|
303 |
// if (actual_edge.valid()) {
|
marci@281
|
304 |
// Node w=G.bNode(actual_edge);
|
marci@281
|
305 |
// if (!reached.get(w)) {
|
marci@281
|
306 |
// bfs_queue.push(OutEdgeIt(G, w));
|
marci@281
|
307 |
// reached.set(w, true);
|
marci@281
|
308 |
// b_node_newly_reached=true;
|
marci@281
|
309 |
// } else {
|
marci@281
|
310 |
// b_node_newly_reached=false;
|
marci@281
|
311 |
// }
|
marci@281
|
312 |
// }
|
marci@281
|
313 |
// }
|
marci@281
|
314 |
// void next() {
|
marci@281
|
315 |
// if (bfs_queue.front().valid()) {
|
marci@281
|
316 |
// ++(bfs_queue.front());
|
marci@281
|
317 |
// actual_edge=bfs_queue.front();
|
marci@281
|
318 |
// if (actual_edge.valid()) {
|
marci@281
|
319 |
// Node w=G.bNode(actual_edge);
|
marci@281
|
320 |
// if (!reached.get(w)) {
|
marci@281
|
321 |
// bfs_queue.push(OutEdgeIt(G, w));
|
marci@281
|
322 |
// reached.set(w, true);
|
marci@281
|
323 |
// b_node_newly_reached=true;
|
marci@281
|
324 |
// } else {
|
marci@281
|
325 |
// b_node_newly_reached=false;
|
marci@281
|
326 |
// }
|
marci@281
|
327 |
// }
|
marci@281
|
328 |
// } else {
|
marci@281
|
329 |
// bfs_queue.pop();
|
marci@281
|
330 |
// actual_edge=bfs_queue.front();
|
marci@281
|
331 |
// if (actual_edge.valid()) {
|
marci@281
|
332 |
// Node w=G.bNode(actual_edge);
|
marci@281
|
333 |
// if (!reached.get(w)) {
|
marci@281
|
334 |
// bfs_queue.push(OutEdgeIt(G, w));
|
marci@281
|
335 |
// reached.set(w, true);
|
marci@281
|
336 |
// b_node_newly_reached=true;
|
marci@281
|
337 |
// } else {
|
marci@281
|
338 |
// b_node_newly_reached=false;
|
marci@281
|
339 |
// }
|
marci@281
|
340 |
// }
|
marci@281
|
341 |
// }
|
marci@281
|
342 |
// //return *this;
|
marci@281
|
343 |
// }
|
marci@281
|
344 |
// bool finished() { return bfs_queue.empty(); }
|
marci@281
|
345 |
// operator OutEdgeIt () { return actual_edge; }
|
marci@281
|
346 |
// bool bNodeIsNewlyReached() { return b_node_newly_reached; }
|
marci@281
|
347 |
// bool aNodeIsExamined() { return !(actual_edge.valid()); }
|
marci@281
|
348 |
// };
|
marci@281
|
349 |
|
marci@281
|
350 |
|
marci@281
|
351 |
// template <typename Graph, typename OutEdgeIt, typename ReachedMap>
|
marci@281
|
352 |
// struct DfsIterator1 {
|
marci@281
|
353 |
// typedef typename Graph::Node Node;
|
marci@281
|
354 |
// Graph& G;
|
marci@281
|
355 |
// std::stack<OutEdgeIt>& bfs_queue;
|
marci@281
|
356 |
// ReachedMap& reached;
|
marci@281
|
357 |
// bool b_node_newly_reached;
|
marci@281
|
358 |
// OutEdgeIt actual_edge;
|
marci@281
|
359 |
// DfsIterator1(Graph& _G,
|
marci@281
|
360 |
// std::stack<OutEdgeIt>& _bfs_queue,
|
marci@281
|
361 |
// ReachedMap& _reached) :
|
marci@281
|
362 |
// G(_G), bfs_queue(_bfs_queue), reached(_reached) {
|
marci@281
|
363 |
// //actual_edge=bfs_queue.top();
|
marci@281
|
364 |
// //if (actual_edge.valid()) {
|
marci@281
|
365 |
// // Node w=G.bNode(actual_edge);
|
marci@281
|
366 |
// //if (!reached.get(w)) {
|
marci@281
|
367 |
// // bfs_queue.push(OutEdgeIt(G, w));
|
marci@281
|
368 |
// // reached.set(w, true);
|
marci@281
|
369 |
// // b_node_newly_reached=true;
|
marci@281
|
370 |
// //} else {
|
marci@281
|
371 |
// // ++(bfs_queue.top());
|
marci@281
|
372 |
// // b_node_newly_reached=false;
|
marci@281
|
373 |
// //}
|
marci@281
|
374 |
// //} else {
|
marci@281
|
375 |
// // bfs_queue.pop();
|
marci@281
|
376 |
// //}
|
marci@281
|
377 |
// }
|
marci@281
|
378 |
// void next() {
|
marci@281
|
379 |
// actual_edge=bfs_queue.top();
|
marci@281
|
380 |
// if (actual_edge.valid()) {
|
marci@281
|
381 |
// Node w=G.bNode(actual_edge);
|
marci@281
|
382 |
// if (!reached.get(w)) {
|
marci@281
|
383 |
// bfs_queue.push(OutEdgeIt(G, w));
|
marci@281
|
384 |
// reached.set(w, true);
|
marci@281
|
385 |
// b_node_newly_reached=true;
|
marci@281
|
386 |
// } else {
|
marci@281
|
387 |
// ++(bfs_queue.top());
|
marci@281
|
388 |
// b_node_newly_reached=false;
|
marci@281
|
389 |
// }
|
marci@281
|
390 |
// } else {
|
marci@281
|
391 |
// bfs_queue.pop();
|
marci@281
|
392 |
// }
|
marci@281
|
393 |
// //return *this;
|
marci@281
|
394 |
// }
|
marci@281
|
395 |
// bool finished() { return bfs_queue.empty(); }
|
marci@281
|
396 |
// operator OutEdgeIt () { return actual_edge; }
|
marci@281
|
397 |
// bool bNodeIsNewlyReached() { return b_node_newly_reached; }
|
marci@281
|
398 |
// bool aNodeIsLeaved() { return !(actual_edge.valid()); }
|
marci@281
|
399 |
// };
|
marci@281
|
400 |
|
marci@281
|
401 |
// template <typename Graph, typename OutEdgeIt, typename ReachedMap>
|
marci@281
|
402 |
// class BfsIterator2 {
|
marci@281
|
403 |
// typedef typename Graph::Node Node;
|
marci@281
|
404 |
// const Graph& G;
|
marci@281
|
405 |
// std::queue<OutEdgeIt> bfs_queue;
|
marci@281
|
406 |
// ReachedMap reached;
|
marci@281
|
407 |
// bool b_node_newly_reached;
|
marci@281
|
408 |
// OutEdgeIt actual_edge;
|
marci@281
|
409 |
// public:
|
marci@281
|
410 |
// BfsIterator2(const Graph& _G) : G(_G), reached(G, false) { }
|
marci@281
|
411 |
// void pushAndSetReached(Node s) {
|
marci@281
|
412 |
// reached.set(s, true);
|
marci@281
|
413 |
// if (bfs_queue.empty()) {
|
marci@281
|
414 |
// bfs_queue.push(G.template first<OutEdgeIt>(s));
|
marci@281
|
415 |
// actual_edge=bfs_queue.front();
|
marci@281
|
416 |
// if (actual_edge.valid()) {
|
marci@281
|
417 |
// Node w=G.bNode(actual_edge);
|
marci@281
|
418 |
// if (!reached.get(w)) {
|
marci@281
|
419 |
// bfs_queue.push(G.template first<OutEdgeIt>(w));
|
marci@281
|
420 |
// reached.set(w, true);
|
marci@281
|
421 |
// b_node_newly_reached=true;
|
marci@281
|
422 |
// } else {
|
marci@281
|
423 |
// b_node_newly_reached=false;
|
marci@281
|
424 |
// }
|
marci@281
|
425 |
// } //else {
|
marci@281
|
426 |
// //}
|
marci@281
|
427 |
// } else {
|
marci@281
|
428 |
// bfs_queue.push(G.template first<OutEdgeIt>(s));
|
marci@281
|
429 |
// }
|
marci@281
|
430 |
// }
|
marci@281
|
431 |
// BfsIterator2<Graph, OutEdgeIt, ReachedMap>&
|
marci@281
|
432 |
// operator++() {
|
marci@281
|
433 |
// if (bfs_queue.front().valid()) {
|
marci@281
|
434 |
// ++(bfs_queue.front());
|
marci@281
|
435 |
// actual_edge=bfs_queue.front();
|
marci@281
|
436 |
// if (actual_edge.valid()) {
|
marci@281
|
437 |
// Node w=G.bNode(actual_edge);
|
marci@281
|
438 |
// if (!reached.get(w)) {
|
marci@281
|
439 |
// bfs_queue.push(G.template first<OutEdgeIt>(w));
|
marci@281
|
440 |
// reached.set(w, true);
|
marci@281
|
441 |
// b_node_newly_reached=true;
|
marci@281
|
442 |
// } else {
|
marci@281
|
443 |
// b_node_newly_reached=false;
|
marci@281
|
444 |
// }
|
marci@281
|
445 |
// }
|
marci@281
|
446 |
// } else {
|
marci@281
|
447 |
// bfs_queue.pop();
|
marci@281
|
448 |
// if (!bfs_queue.empty()) {
|
marci@281
|
449 |
// actual_edge=bfs_queue.front();
|
marci@281
|
450 |
// if (actual_edge.valid()) {
|
marci@281
|
451 |
// Node w=G.bNode(actual_edge);
|
marci@281
|
452 |
// if (!reached.get(w)) {
|
marci@281
|
453 |
// bfs_queue.push(G.template first<OutEdgeIt>(w));
|
marci@281
|
454 |
// reached.set(w, true);
|
marci@281
|
455 |
// b_node_newly_reached=true;
|
marci@281
|
456 |
// } else {
|
marci@281
|
457 |
// b_node_newly_reached=false;
|
marci@281
|
458 |
// }
|
marci@281
|
459 |
// }
|
marci@281
|
460 |
// }
|
marci@281
|
461 |
// }
|
marci@281
|
462 |
// return *this;
|
marci@281
|
463 |
// }
|
marci@281
|
464 |
// bool finished() const { return bfs_queue.empty(); }
|
marci@281
|
465 |
// operator OutEdgeIt () const { return actual_edge; }
|
marci@281
|
466 |
// bool isBNodeNewlyReached() const { return b_node_newly_reached; }
|
marci@281
|
467 |
// bool isANodeExamined() const { return !(actual_edge.valid()); }
|
marci@281
|
468 |
// const ReachedMap& getReachedMap() const { return reached; }
|
marci@281
|
469 |
// const std::queue<OutEdgeIt>& getBfsQueue() const { return bfs_queue; }
|
marci@281
|
470 |
// };
|
marci@281
|
471 |
|
marci@281
|
472 |
|
marci@281
|
473 |
// template <typename Graph, typename OutEdgeIt, typename ReachedMap>
|
marci@281
|
474 |
// class BfsIterator3 {
|
marci@281
|
475 |
// typedef typename Graph::Node Node;
|
marci@281
|
476 |
// const Graph& G;
|
marci@281
|
477 |
// std::queue< std::pair<Node, OutEdgeIt> > bfs_queue;
|
marci@281
|
478 |
// ReachedMap reached;
|
marci@281
|
479 |
// bool b_node_newly_reached;
|
marci@281
|
480 |
// OutEdgeIt actual_edge;
|
marci@281
|
481 |
// public:
|
marci@281
|
482 |
// BfsIterator3(const Graph& _G) : G(_G), reached(G, false) { }
|
marci@281
|
483 |
// void pushAndSetReached(Node s) {
|
marci@281
|
484 |
// reached.set(s, true);
|
marci@281
|
485 |
// if (bfs_queue.empty()) {
|
marci@281
|
486 |
// bfs_queue.push(std::pair<Node, OutEdgeIt>(s, G.template first<OutEdgeIt>(s)));
|
marci@281
|
487 |
// actual_edge=bfs_queue.front().second;
|
marci@281
|
488 |
// if (actual_edge.valid()) {
|
marci@281
|
489 |
// Node w=G.bNode(actual_edge);
|
marci@281
|
490 |
// if (!reached.get(w)) {
|
marci@281
|
491 |
// bfs_queue.push(std::pair<Node, OutEdgeIt>(w, G.template first<OutEdgeIt>(w)));
|
marci@281
|
492 |
// reached.set(w, true);
|
marci@281
|
493 |
// b_node_newly_reached=true;
|
marci@281
|
494 |
// } else {
|
marci@281
|
495 |
// b_node_newly_reached=false;
|
marci@281
|
496 |
// }
|
marci@281
|
497 |
// } //else {
|
marci@281
|
498 |
// //}
|
marci@281
|
499 |
// } else {
|
marci@281
|
500 |
// bfs_queue.push(std::pair<Node, OutEdgeIt>(s, G.template first<OutEdgeIt>(s)));
|
marci@281
|
501 |
// }
|
marci@281
|
502 |
// }
|
marci@281
|
503 |
// BfsIterator3<Graph, OutEdgeIt, ReachedMap>&
|
marci@281
|
504 |
// operator++() {
|
marci@281
|
505 |
// if (bfs_queue.front().second.valid()) {
|
marci@281
|
506 |
// ++(bfs_queue.front().second);
|
marci@281
|
507 |
// actual_edge=bfs_queue.front().second;
|
marci@281
|
508 |
// if (actual_edge.valid()) {
|
marci@281
|
509 |
// Node w=G.bNode(actual_edge);
|
marci@281
|
510 |
// if (!reached.get(w)) {
|
marci@281
|
511 |
// bfs_queue.push(std::pair<Node, OutEdgeIt>(w, G.template first<OutEdgeIt>(w)));
|
marci@281
|
512 |
// reached.set(w, true);
|
marci@281
|
513 |
// b_node_newly_reached=true;
|
marci@281
|
514 |
// } else {
|
marci@281
|
515 |
// b_node_newly_reached=false;
|
marci@281
|
516 |
// }
|
marci@281
|
517 |
// }
|
marci@281
|
518 |
// } else {
|
marci@281
|
519 |
// bfs_queue.pop();
|
marci@281
|
520 |
// if (!bfs_queue.empty()) {
|
marci@281
|
521 |
// actual_edge=bfs_queue.front().second;
|
marci@281
|
522 |
// if (actual_edge.valid()) {
|
marci@281
|
523 |
// Node w=G.bNode(actual_edge);
|
marci@281
|
524 |
// if (!reached.get(w)) {
|
marci@281
|
525 |
// bfs_queue.push(std::pair<Node, OutEdgeIt>(w, G.template first<OutEdgeIt>(w)));
|
marci@281
|
526 |
// reached.set(w, true);
|
marci@281
|
527 |
// b_node_newly_reached=true;
|
marci@281
|
528 |
// } else {
|
marci@281
|
529 |
// b_node_newly_reached=false;
|
marci@281
|
530 |
// }
|
marci@281
|
531 |
// }
|
marci@281
|
532 |
// }
|
marci@281
|
533 |
// }
|
marci@281
|
534 |
// return *this;
|
marci@281
|
535 |
// }
|
marci@281
|
536 |
// bool finished() const { return bfs_queue.empty(); }
|
marci@281
|
537 |
// operator OutEdgeIt () const { return actual_edge; }
|
marci@281
|
538 |
// bool isBNodeNewlyReached() const { return b_node_newly_reached; }
|
marci@281
|
539 |
// bool isANodeExamined() const { return !(actual_edge.valid()); }
|
marci@281
|
540 |
// Node aNode() const { return bfs_queue.front().first; }
|
marci@281
|
541 |
// Node bNode() const { return G.bNode(actual_edge); }
|
marci@281
|
542 |
// const ReachedMap& getReachedMap() const { return reached; }
|
marci@281
|
543 |
// //const std::queue< std::pair<Node, OutEdgeIt> >& getBfsQueue() const { return bfs_queue; }
|
marci@281
|
544 |
// };
|
marci@281
|
545 |
|
marci@281
|
546 |
|
marci@281
|
547 |
// template <typename Graph, typename OutEdgeIt,
|
marci@281
|
548 |
// typename ReachedMap/*=typename Graph::NodeMap<bool>*/ >
|
marci@281
|
549 |
// class BfsIterator4 {
|
marci@281
|
550 |
// typedef typename Graph::Node Node;
|
marci@281
|
551 |
// const Graph& G;
|
marci@281
|
552 |
// std::queue<Node> bfs_queue;
|
marci@281
|
553 |
// ReachedMap& reached;
|
marci@281
|
554 |
// bool b_node_newly_reached;
|
marci@281
|
555 |
// OutEdgeIt actual_edge;
|
marci@281
|
556 |
// bool own_reached_map;
|
marci@281
|
557 |
// public:
|
marci@281
|
558 |
// BfsIterator4(const Graph& _G, ReachedMap& _reached) :
|
marci@281
|
559 |
// G(_G), reached(_reached),
|
marci@281
|
560 |
// own_reached_map(false) { }
|
marci@281
|
561 |
// BfsIterator4(const Graph& _G) :
|
marci@281
|
562 |
// G(_G), reached(*(new ReachedMap(G /*, false*/))),
|
marci@281
|
563 |
// own_reached_map(true) { }
|
marci@281
|
564 |
// ~BfsIterator4() { if (own_reached_map) delete &reached; }
|
marci@281
|
565 |
// void pushAndSetReached(Node s) {
|
marci@281
|
566 |
// //std::cout << "mimi" << &reached << std::endl;
|
marci@281
|
567 |
// reached.set(s, true);
|
marci@281
|
568 |
// //std::cout << "mumus" << std::endl;
|
marci@281
|
569 |
// if (bfs_queue.empty()) {
|
marci@281
|
570 |
// //std::cout << "bibi1" << std::endl;
|
marci@281
|
571 |
// bfs_queue.push(s);
|
marci@281
|
572 |
// //std::cout << "zizi" << std::endl;
|
marci@281
|
573 |
// G./*getF*/first(actual_edge, s);
|
marci@281
|
574 |
// //std::cout << "kiki" << std::endl;
|
marci@281
|
575 |
// if (G.valid(actual_edge)/*.valid()*/) {
|
marci@281
|
576 |
// Node w=G.bNode(actual_edge);
|
marci@281
|
577 |
// if (!reached.get(w)) {
|
marci@281
|
578 |
// bfs_queue.push(w);
|
marci@281
|
579 |
// reached.set(w, true);
|
marci@281
|
580 |
// b_node_newly_reached=true;
|
marci@281
|
581 |
// } else {
|
marci@281
|
582 |
// b_node_newly_reached=false;
|
marci@281
|
583 |
// }
|
marci@281
|
584 |
// }
|
marci@281
|
585 |
// } else {
|
marci@281
|
586 |
// //std::cout << "bibi2" << std::endl;
|
marci@281
|
587 |
// bfs_queue.push(s);
|
marci@281
|
588 |
// }
|
marci@281
|
589 |
// }
|
marci@281
|
590 |
// BfsIterator4<Graph, OutEdgeIt, ReachedMap>&
|
marci@281
|
591 |
// operator++() {
|
marci@281
|
592 |
// if (G.valid(actual_edge)/*.valid()*/) {
|
marci@281
|
593 |
// /*++*/G.next(actual_edge);
|
marci@281
|
594 |
// if (G.valid(actual_edge)/*.valid()*/) {
|
marci@281
|
595 |
// Node w=G.bNode(actual_edge);
|
marci@281
|
596 |
// if (!reached.get(w)) {
|
marci@281
|
597 |
// bfs_queue.push(w);
|
marci@281
|
598 |
// reached.set(w, true);
|
marci@281
|
599 |
// b_node_newly_reached=true;
|
marci@281
|
600 |
// } else {
|
marci@281
|
601 |
// b_node_newly_reached=false;
|
marci@281
|
602 |
// }
|
marci@281
|
603 |
// }
|
marci@281
|
604 |
// } else {
|
marci@281
|
605 |
// bfs_queue.pop();
|
marci@281
|
606 |
// if (!bfs_queue.empty()) {
|
marci@281
|
607 |
// G./*getF*/first(actual_edge, bfs_queue.front());
|
marci@281
|
608 |
// if (G.valid(actual_edge)/*.valid()*/) {
|
marci@281
|
609 |
// Node w=G.bNode(actual_edge);
|
marci@281
|
610 |
// if (!reached.get(w)) {
|
marci@281
|
611 |
// bfs_queue.push(w);
|
marci@281
|
612 |
// reached.set(w, true);
|
marci@281
|
613 |
// b_node_newly_reached=true;
|
marci@281
|
614 |
// } else {
|
marci@281
|
615 |
// b_node_newly_reached=false;
|
marci@281
|
616 |
// }
|
marci@281
|
617 |
// }
|
marci@281
|
618 |
// }
|
marci@281
|
619 |
// }
|
marci@281
|
620 |
// return *this;
|
marci@281
|
621 |
// }
|
marci@281
|
622 |
// bool finished() const { return bfs_queue.empty(); }
|
marci@281
|
623 |
// operator OutEdgeIt () const { return actual_edge; }
|
marci@281
|
624 |
// bool isBNodeNewlyReached() const { return b_node_newly_reached; }
|
marci@281
|
625 |
// bool isANodeExamined() const { return !(G.valid(actual_edge)/*.valid()*/); }
|
marci@281
|
626 |
// Node aNode() const { return bfs_queue.front(); }
|
marci@281
|
627 |
// Node bNode() const { return G.bNode(actual_edge); }
|
marci@281
|
628 |
// const ReachedMap& getReachedMap() const { return reached; }
|
marci@281
|
629 |
// const std::queue<Node>& getBfsQueue() const { return bfs_queue; }
|
marci@281
|
630 |
// };
|
marci@281
|
631 |
|
marci@281
|
632 |
|
marci@298
|
633 |
template <typename Graph, /*typename OutEdgeIt,*/
|
marci@298
|
634 |
typename ReachedMap/*=typename Graph::NodeMap<bool>*/ >
|
marci@281
|
635 |
class BfsIterator5 {
|
marci@298
|
636 |
protected:
|
marci@298
|
637 |
typedef typename Graph::Node Node;
|
marci@298
|
638 |
typedef typename Graph::OutEdgeIt OutEdgeIt;
|
marci@298
|
639 |
const Graph* graph;
|
marci@281
|
640 |
std::queue<Node> bfs_queue;
|
marci@281
|
641 |
ReachedMap& reached;
|
marci@281
|
642 |
bool b_node_newly_reached;
|
marci@281
|
643 |
OutEdgeIt actual_edge;
|
marci@281
|
644 |
bool own_reached_map;
|
marci@281
|
645 |
public:
|
marci@298
|
646 |
BfsIterator5(const Graph& _graph, ReachedMap& _reached) :
|
marci@298
|
647 |
graph(&_graph), reached(_reached),
|
marci@281
|
648 |
own_reached_map(false) { }
|
marci@298
|
649 |
BfsIterator5(const Graph& _graph) :
|
marci@298
|
650 |
graph(&_graph), reached(*(new ReachedMap(*graph /*, false*/))),
|
marci@281
|
651 |
own_reached_map(true) { }
|
marci@281
|
652 |
~BfsIterator5() { if (own_reached_map) delete &reached; }
|
marci@281
|
653 |
void pushAndSetReached(Node s) {
|
marci@281
|
654 |
reached.set(s, true);
|
marci@281
|
655 |
if (bfs_queue.empty()) {
|
marci@281
|
656 |
bfs_queue.push(s);
|
marci@298
|
657 |
graph->first(actual_edge, s);
|
marci@298
|
658 |
if (graph->valid(actual_edge)) {
|
marci@298
|
659 |
Node w=graph->bNode(actual_edge);
|
marci@281
|
660 |
if (!reached.get(w)) {
|
marci@281
|
661 |
bfs_queue.push(w);
|
marci@281
|
662 |
reached.set(w, true);
|
marci@281
|
663 |
b_node_newly_reached=true;
|
marci@281
|
664 |
} else {
|
marci@281
|
665 |
b_node_newly_reached=false;
|
marci@281
|
666 |
}
|
marci@281
|
667 |
}
|
marci@281
|
668 |
} else {
|
marci@281
|
669 |
bfs_queue.push(s);
|
marci@281
|
670 |
}
|
marci@281
|
671 |
}
|
marci@298
|
672 |
BfsIterator5<Graph, /*OutEdgeIt,*/ ReachedMap>&
|
marci@281
|
673 |
operator++() {
|
marci@298
|
674 |
if (graph->valid(actual_edge)) {
|
marci@298
|
675 |
graph->next(actual_edge);
|
marci@298
|
676 |
if (graph->valid(actual_edge)) {
|
marci@298
|
677 |
Node w=graph->bNode(actual_edge);
|
marci@281
|
678 |
if (!reached.get(w)) {
|
marci@281
|
679 |
bfs_queue.push(w);
|
marci@281
|
680 |
reached.set(w, true);
|
marci@281
|
681 |
b_node_newly_reached=true;
|
marci@281
|
682 |
} else {
|
marci@281
|
683 |
b_node_newly_reached=false;
|
marci@281
|
684 |
}
|
marci@281
|
685 |
}
|
marci@281
|
686 |
} else {
|
marci@281
|
687 |
bfs_queue.pop();
|
marci@281
|
688 |
if (!bfs_queue.empty()) {
|
marci@298
|
689 |
graph->first(actual_edge, bfs_queue.front());
|
marci@298
|
690 |
if (graph->valid(actual_edge)) {
|
marci@298
|
691 |
Node w=graph->bNode(actual_edge);
|
marci@281
|
692 |
if (!reached.get(w)) {
|
marci@281
|
693 |
bfs_queue.push(w);
|
marci@281
|
694 |
reached.set(w, true);
|
marci@281
|
695 |
b_node_newly_reached=true;
|
marci@281
|
696 |
} else {
|
marci@281
|
697 |
b_node_newly_reached=false;
|
marci@281
|
698 |
}
|
marci@281
|
699 |
}
|
marci@281
|
700 |
}
|
marci@281
|
701 |
}
|
marci@281
|
702 |
return *this;
|
marci@281
|
703 |
}
|
marci@281
|
704 |
bool finished() const { return bfs_queue.empty(); }
|
marci@281
|
705 |
operator OutEdgeIt () const { return actual_edge; }
|
marci@281
|
706 |
bool isBNodeNewlyReached() const { return b_node_newly_reached; }
|
marci@298
|
707 |
bool isANodeExamined() const { return !(graph->valid(actual_edge)); }
|
marci@281
|
708 |
Node aNode() const { return bfs_queue.front(); }
|
marci@298
|
709 |
Node bNode() const { return graph->bNode(actual_edge); }
|
marci@281
|
710 |
const ReachedMap& getReachedMap() const { return reached; }
|
marci@281
|
711 |
const std::queue<Node>& getBfsQueue() const { return bfs_queue; }
|
marci@281
|
712 |
};
|
marci@281
|
713 |
|
marci@281
|
714 |
// template <typename Graph, typename OutEdgeIt,
|
marci@281
|
715 |
// typename ReachedMap/*=typename Graph::NodeMap<bool>*/ >
|
marci@281
|
716 |
// class DfsIterator4 {
|
marci@281
|
717 |
// typedef typename Graph::Node Node;
|
marci@281
|
718 |
// const Graph& G;
|
marci@281
|
719 |
// std::stack<OutEdgeIt> dfs_stack;
|
marci@281
|
720 |
// bool b_node_newly_reached;
|
marci@281
|
721 |
// OutEdgeIt actual_edge;
|
marci@281
|
722 |
// Node actual_node;
|
marci@281
|
723 |
// ReachedMap& reached;
|
marci@281
|
724 |
// bool own_reached_map;
|
marci@281
|
725 |
// public:
|
marci@281
|
726 |
// DfsIterator4(const Graph& _G, ReachedMap& _reached) :
|
marci@281
|
727 |
// G(_G), reached(_reached),
|
marci@281
|
728 |
// own_reached_map(false) { }
|
marci@281
|
729 |
// DfsIterator4(const Graph& _G) :
|
marci@281
|
730 |
// G(_G), reached(*(new ReachedMap(G /*, false*/))),
|
marci@281
|
731 |
// own_reached_map(true) { }
|
marci@281
|
732 |
// ~DfsIterator4() { if (own_reached_map) delete &reached; }
|
marci@281
|
733 |
// void pushAndSetReached(Node s) {
|
marci@281
|
734 |
// actual_node=s;
|
marci@281
|
735 |
// reached.set(s, true);
|
marci@281
|
736 |
// dfs_stack.push(G.template first<OutEdgeIt>(s));
|
marci@281
|
737 |
// }
|
marci@281
|
738 |
// DfsIterator4<Graph, OutEdgeIt, ReachedMap>&
|
marci@281
|
739 |
// operator++() {
|
marci@281
|
740 |
// actual_edge=dfs_stack.top();
|
marci@281
|
741 |
// //actual_node=G.aNode(actual_edge);
|
marci@281
|
742 |
// if (G.valid(actual_edge)/*.valid()*/) {
|
marci@281
|
743 |
// Node w=G.bNode(actual_edge);
|
marci@281
|
744 |
// actual_node=w;
|
marci@281
|
745 |
// if (!reached.get(w)) {
|
marci@281
|
746 |
// dfs_stack.push(G.template first<OutEdgeIt>(w));
|
marci@281
|
747 |
// reached.set(w, true);
|
marci@281
|
748 |
// b_node_newly_reached=true;
|
marci@281
|
749 |
// } else {
|
marci@281
|
750 |
// actual_node=G.aNode(actual_edge);
|
marci@281
|
751 |
// /*++*/G.next(dfs_stack.top());
|
marci@281
|
752 |
// b_node_newly_reached=false;
|
marci@281
|
753 |
// }
|
marci@281
|
754 |
// } else {
|
marci@281
|
755 |
// //actual_node=G.aNode(dfs_stack.top());
|
marci@281
|
756 |
// dfs_stack.pop();
|
marci@281
|
757 |
// }
|
marci@281
|
758 |
// return *this;
|
marci@281
|
759 |
// }
|
marci@281
|
760 |
// bool finished() const { return dfs_stack.empty(); }
|
marci@281
|
761 |
// operator OutEdgeIt () const { return actual_edge; }
|
marci@281
|
762 |
// bool isBNodeNewlyReached() const { return b_node_newly_reached; }
|
marci@281
|
763 |
// bool isANodeExamined() const { return !(G.valid(actual_edge)/*.valid()*/); }
|
marci@281
|
764 |
// Node aNode() const { return actual_node; /*FIXME*/}
|
marci@281
|
765 |
// Node bNode() const { return G.bNode(actual_edge); }
|
marci@281
|
766 |
// const ReachedMap& getReachedMap() const { return reached; }
|
marci@281
|
767 |
// const std::stack<OutEdgeIt>& getDfsStack() const { return dfs_stack; }
|
marci@281
|
768 |
// };
|
marci@281
|
769 |
|
marci@298
|
770 |
template <typename Graph, /*typename OutEdgeIt,*/
|
marci@298
|
771 |
typename ReachedMap/*=typename Graph::NodeMap<bool>*/ >
|
marci@281
|
772 |
class DfsIterator5 {
|
marci@298
|
773 |
protected:
|
marci@298
|
774 |
typedef typename Graph::Node Node;
|
marci@298
|
775 |
typedef typename Graph::OutEdgeIt OutEdgeIt;
|
marci@298
|
776 |
const Graph* graph;
|
marci@281
|
777 |
std::stack<OutEdgeIt> dfs_stack;
|
marci@281
|
778 |
bool b_node_newly_reached;
|
marci@281
|
779 |
OutEdgeIt actual_edge;
|
marci@281
|
780 |
Node actual_node;
|
marci@281
|
781 |
ReachedMap& reached;
|
marci@281
|
782 |
bool own_reached_map;
|
marci@281
|
783 |
public:
|
marci@298
|
784 |
DfsIterator5(const Graph& _graph, ReachedMap& _reached) :
|
marci@298
|
785 |
graph(&_graph), reached(_reached),
|
marci@281
|
786 |
own_reached_map(false) { }
|
marci@298
|
787 |
DfsIterator5(const Graph& _graph) :
|
marci@298
|
788 |
graph(&_graph), reached(*(new ReachedMap(*graph /*, false*/))),
|
marci@281
|
789 |
own_reached_map(true) { }
|
marci@281
|
790 |
~DfsIterator5() { if (own_reached_map) delete &reached; }
|
marci@281
|
791 |
void pushAndSetReached(Node s) {
|
marci@281
|
792 |
actual_node=s;
|
marci@281
|
793 |
reached.set(s, true);
|
marci@281
|
794 |
OutEdgeIt e;
|
marci@298
|
795 |
graph->first(e, s);
|
marci@281
|
796 |
dfs_stack.push(e);
|
marci@281
|
797 |
}
|
marci@298
|
798 |
DfsIterator5<Graph, /*OutEdgeIt,*/ ReachedMap>&
|
marci@281
|
799 |
operator++() {
|
marci@281
|
800 |
actual_edge=dfs_stack.top();
|
marci@281
|
801 |
//actual_node=G.aNode(actual_edge);
|
marci@298
|
802 |
if (graph->valid(actual_edge)/*.valid()*/) {
|
marci@298
|
803 |
Node w=graph->bNode(actual_edge);
|
marci@281
|
804 |
actual_node=w;
|
marci@281
|
805 |
if (!reached.get(w)) {
|
marci@281
|
806 |
OutEdgeIt e;
|
marci@298
|
807 |
graph->first(e, w);
|
marci@281
|
808 |
dfs_stack.push(e);
|
marci@281
|
809 |
reached.set(w, true);
|
marci@281
|
810 |
b_node_newly_reached=true;
|
marci@281
|
811 |
} else {
|
marci@298
|
812 |
actual_node=graph->aNode(actual_edge);
|
marci@298
|
813 |
graph->next(dfs_stack.top());
|
marci@281
|
814 |
b_node_newly_reached=false;
|
marci@281
|
815 |
}
|
marci@281
|
816 |
} else {
|
marci@281
|
817 |
//actual_node=G.aNode(dfs_stack.top());
|
marci@281
|
818 |
dfs_stack.pop();
|
marci@281
|
819 |
}
|
marci@281
|
820 |
return *this;
|
marci@281
|
821 |
}
|
marci@281
|
822 |
bool finished() const { return dfs_stack.empty(); }
|
marci@281
|
823 |
operator OutEdgeIt () const { return actual_edge; }
|
marci@281
|
824 |
bool isBNodeNewlyReached() const { return b_node_newly_reached; }
|
marci@298
|
825 |
bool isANodeExamined() const { return !(graph->valid(actual_edge)); }
|
marci@281
|
826 |
Node aNode() const { return actual_node; /*FIXME*/}
|
marci@281
|
827 |
Node bNode() const { return G.bNode(actual_edge); }
|
marci@281
|
828 |
const ReachedMap& getReachedMap() const { return reached; }
|
marci@281
|
829 |
const std::stack<OutEdgeIt>& getDfsStack() const { return dfs_stack; }
|
marci@281
|
830 |
};
|
marci@281
|
831 |
|
marci@281
|
832 |
|
marci@281
|
833 |
|
marci@281
|
834 |
} // namespace hugo
|
marci@281
|
835 |
|
marci@281
|
836 |
#endif //HUGO_BFS_ITERATOR_H
|