Lines 78-87
Link Here
|
78 |
} |
78 |
} |
79 |
DFS &operator++() { |
79 |
DFS &operator++() { |
80 |
if(m_curr.e) |
80 |
if(m_curr.e) |
81 |
gd<Hit>(m_curr.e)[m_hitpos] = true; |
81 |
gd<Hit>(m_curr.e)[this->m_hitpos] = true; |
82 |
else { |
82 |
else { |
83 |
assert(m_curr.n); |
83 |
assert(m_curr.n); |
84 |
gd<Hit>(m_curr.n)[m_hitpos] = true; |
84 |
gd<Hit>(m_curr.n)[this->m_hitpos] = true; |
85 |
} |
85 |
} |
86 |
// try edges |
86 |
// try edges |
87 |
if(m_curr.n && follow()) |
87 |
if(m_curr.n && follow()) |
Lines 143-152
Link Here
|
143 |
} |
143 |
} |
144 |
bool outs(typename G::outedge_iter start) { |
144 |
bool outs(typename G::outedge_iter start) { |
145 |
for(typename G::outedge_iter ei = start; ei!=m_curr.n->outs().end(); ++ei) |
145 |
for(typename G::outedge_iter ei = start; ei!=m_curr.n->outs().end(); ++ei) |
146 |
if(!gd<Hit>(*ei)[m_hitpos]) { |
146 |
if(!gd<Hit>(*ei)[this->m_hitpos]) { |
147 |
m_stack.push(m_curr); |
147 |
m_stack.push(m_curr); |
148 |
m_curr.e = *ei; |
148 |
m_curr.e = *ei; |
149 |
if(!gd<Hit>(m_curr.e->head)[m_hitpos]) |
149 |
if(!gd<Hit>(m_curr.e->head)[this->m_hitpos]) |
150 |
m_curr.n = m_curr.e->head; |
150 |
m_curr.n = m_curr.e->head; |
151 |
else |
151 |
else |
152 |
m_curr.n = 0; |
152 |
m_curr.n = 0; |
Lines 156-165
Link Here
|
156 |
} |
156 |
} |
157 |
bool ins(typename G::inedge_iter start) { |
157 |
bool ins(typename G::inedge_iter start) { |
158 |
for(typename G::inedge_iter ei = start; ei!=m_curr.n->ins().end(); ++ei) |
158 |
for(typename G::inedge_iter ei = start; ei!=m_curr.n->ins().end(); ++ei) |
159 |
if(!gd<Hit>(*ei)[m_hitpos]) { |
159 |
if(!gd<Hit>(*ei)[this->m_hitpos]) { |
160 |
m_stack.push(m_curr); |
160 |
m_stack.push(m_curr); |
161 |
m_curr.e = *ei; |
161 |
m_curr.e = *ei; |
162 |
if(!gd<Hit>(m_curr.e->tail)[m_hitpos]) |
162 |
if(!gd<Hit>(m_curr.e->tail)[this->m_hitpos]) |
163 |
m_curr.n = m_curr.e->tail; |
163 |
m_curr.n = m_curr.e->tail; |
164 |
else |
164 |
else |
165 |
m_curr.n = 0; |
165 |
m_curr.n = 0; |
Lines 180-187
Link Here
|
180 |
return true; |
180 |
return true; |
181 |
} |
181 |
} |
182 |
bool next() { |
182 |
bool next() { |
183 |
for(;m_nodeiter!=m_g->parent->nodes().end();++m_nodeiter) |
183 |
for(;m_nodeiter!=this->m_g->parent->nodes().end();++m_nodeiter) |
184 |
if(!gd<Hit>(*m_nodeiter)[m_hitpos]) { |
184 |
if(!gd<Hit>(*m_nodeiter)[this->m_hitpos]) { |
185 |
m_curr.e = 0; |
185 |
m_curr.e = 0; |
186 |
m_curr.n = *m_nodeiter; |
186 |
m_curr.n = *m_nodeiter; |
187 |
m_nodeiter++; |
187 |
m_nodeiter++; |
Lines 205-235
Link Here
|
205 |
if(last.n) { |
205 |
if(last.n) { |
206 |
if(m_inwards) |
206 |
if(m_inwards) |
207 |
for(typename G::inedge_iter ei = last.n->ins().begin(); ei!=last.n->ins().end(); ++ei) |
207 |
for(typename G::inedge_iter ei = last.n->ins().begin(); ei!=last.n->ins().end(); ++ei) |
208 |
if(!gd<Hit>(*ei)[m_hitpos]) { |
208 |
if(!gd<Hit>(*ei)[this->m_hitpos]) { |
209 |
Node *t = (*ei)->tail; |
209 |
Node *t = (*ei)->tail; |
210 |
if(gd<Hit>(t)[m_hitpos]) |
210 |
if(gd<Hit>(t)[this->m_hitpos]) |
211 |
t = 0; |
211 |
t = 0; |
212 |
else |
212 |
else |
213 |
gd<Hit>(t)[m_hitpos] = true; |
213 |
gd<Hit>(t)[this->m_hitpos] = true; |
214 |
m_queue.push(V(*ei,t)); |
214 |
m_queue.push(V(*ei,t)); |
215 |
gd<Hit>(*ei)[m_hitpos] = true; |
215 |
gd<Hit>(*ei)[this->m_hitpos] = true; |
216 |
} |
216 |
} |
217 |
if(m_outwards) |
217 |
if(m_outwards) |
218 |
for(typename G::outedge_iter ei = last.n->outs().begin(); ei!=last.n->outs().end(); ++ei) |
218 |
for(typename G::outedge_iter ei = last.n->outs().begin(); ei!=last.n->outs().end(); ++ei) |
219 |
if(!gd<Hit>(*ei)[m_hitpos]) { |
219 |
if(!gd<Hit>(*ei)[this->m_hitpos]) { |
220 |
Node *h = (*ei)->head; |
220 |
Node *h = (*ei)->head; |
221 |
if(gd<Hit>(h)[m_hitpos]) |
221 |
if(gd<Hit>(h)[this->m_hitpos]) |
222 |
h = 0; |
222 |
h = 0; |
223 |
else |
223 |
else |
224 |
gd<Hit>(h)[m_hitpos] = true; |
224 |
gd<Hit>(h)[this->m_hitpos] = true; |
225 |
m_queue.push(V(*ei,h)); |
225 |
m_queue.push(V(*ei,h)); |
226 |
gd<Hit>(*ei)[m_hitpos] = true; |
226 |
gd<Hit>(*ei)[this->m_hitpos] = true; |
227 |
} |
227 |
} |
228 |
} |
228 |
} |
229 |
if(m_queue.empty()) |
229 |
if(m_queue.empty()) |
230 |
for(;m_nodeiter!=m_g->nodes().end(); ++m_nodeiter) |
230 |
for(;m_nodeiter!=this->m_g->nodes().end(); ++m_nodeiter) |
231 |
if(!gd<Hit>(*m_nodeiter)[m_hitpos]) { |
231 |
if(!gd<Hit>(*m_nodeiter)[this->m_hitpos]) { |
232 |
gd<Hit>(*m_nodeiter)[m_hitpos] = true; |
232 |
gd<Hit>(*m_nodeiter)[this->m_hitpos] = true; |
233 |
m_queue.push(V(0,*m_nodeiter++)); |
233 |
m_queue.push(V(0,*m_nodeiter++)); |
234 |
break; |
234 |
break; |
235 |
} |
235 |
} |
Lines 241-247
Link Here
|
241 |
BFS(G *g,typename G::Node *start = 0,bool inwards=true,bool outwards=true) : Traversal<G>(g),m_inwards(inwards),m_outwards(outwards) { |
241 |
BFS(G *g,typename G::Node *start = 0,bool inwards=true,bool outwards=true) : Traversal<G>(g),m_inwards(inwards),m_outwards(outwards) { |
242 |
m_nodeiter = start?g->iter(start):g->nodes().begin(); |
242 |
m_nodeiter = start?g->iter(start):g->nodes().begin(); |
243 |
if(m_nodeiter!=g->nodes().end()) { |
243 |
if(m_nodeiter!=g->nodes().end()) { |
244 |
gd<Hit>(*m_nodeiter)[m_hitpos] = true; |
244 |
gd<Hit>(*m_nodeiter)[this->m_hitpos] = true; |
245 |
m_queue.push(V(0,*m_nodeiter++)); |
245 |
m_queue.push(V(0,*m_nodeiter++)); |
246 |
} |
246 |
} |
247 |
} |
247 |
} |