DGtal  0.6.devel
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
BreadthFirstVisitor.ih
1 
30 
31 #include <cstdlib>
33 
35 // IMPLEMENTATION of inline methods.
37 
39 // ----------------------- Standard services ------------------------------
40 
41 //-----------------------------------------------------------------------------
42 template < typename TGraph, typename TMarkSet >
43 inline
45 {
46 }
47 //-----------------------------------------------------------------------------
48 template < typename TGraph, typename TMarkSet >
49 inline
52  : myGraph( g )
53 {
54 }
55 //-----------------------------------------------------------------------------
56 template < typename TGraph, typename TMarkSet >
57 inline
59 ::BreadthFirstVisitor( const Graph & g, const Vertex & p )
60  : myGraph( g )
61 {
62  myMarkedVertices.insert( p );
63  myQueue.push( std::make_pair( p, 0 ) );
64 }
65 //-----------------------------------------------------------------------------
66 template < typename TGraph, typename TMarkSet >
67 template <typename VertexIterator>
68 inline
71  VertexIterator b, VertexIterator e )
72  : myGraph( g )
73 {
74  for ( ; b != e; ++b )
75  {
76  myMarkedVertices.insert( *b );
77  myQueue.push( std::make_pair( *b, 0 ) );
78  }
79 }
80 //-----------------------------------------------------------------------------
81 template < typename TGraph, typename TMarkSet >
82 inline
85 {
86  return myGraph;
87 }
88 //-----------------------------------------------------------------------------
89 template < typename TGraph, typename TMarkSet >
90 inline
91 bool
93 {
94  return myQueue.empty();
95 }
96 //-----------------------------------------------------------------------------
97 template < typename TGraph, typename TMarkSet >
98 inline
101 {
102  ASSERT( ! finished() );
103  return myQueue.front();
104 }
105 //-----------------------------------------------------------------------------
106 template < typename TGraph, typename TMarkSet >
107 inline
108 void
110 {
111  ASSERT( ! finished() );
112  myQueue.pop();
113 }
114 //-----------------------------------------------------------------------------
115 template < typename TGraph, typename TMarkSet >
116 inline
117 void
119 {
120  ASSERT( ! finished() );
121  Node node = myQueue.front();
122  Size d = node.second + 1;
123  myQueue.pop();
124  VertexList tmp;
125  tmp.reserve( myGraph.bestCapacity() );
126  std::back_insert_iterator<VertexList> write_it = std::back_inserter( tmp );
127  myGraph.writeNeighbors( write_it, node.first );
128  for ( typename VertexList::const_iterator it = tmp.begin(),
129  it_end = tmp.end(); it != it_end; ++it )
130  {
131  typename MarkSet::const_iterator mark_it = myMarkedVertices.find( *it );
132  if ( mark_it == myMarkedVertices.end() )
133  {
134  myMarkedVertices.insert( *it );
135  myQueue.push( std::make_pair( *it, d ) );
136  }
137  }
138 }
139 //-----------------------------------------------------------------------------
140 template < typename TGraph, typename TMarkSet >
141 template <typename VertexPredicate>
142 inline
143 void
145 ( const VertexPredicate & authorized_vtx )
146 {
147  ASSERT( ! finished() );
148  Node node = myQueue.front();
149  Size d = node.second + 1;
150  myQueue.pop();
151  VertexList tmp;
152  tmp.reserve( myGraph.bestCapacity() );
153  std::back_insert_iterator<VertexList> write_it = std::back_inserter( tmp );
154  myGraph.writeNeighbors( write_it,
155  node.first,
156  authorized_vtx );
157  for ( typename VertexList::const_iterator it = tmp.begin(),
158  it_end = tmp.end(); it != it_end; ++it )
159  {
160  typename MarkSet::const_iterator mark_it = myMarkedVertices.find( *it );
161  if ( mark_it == myMarkedVertices.end() )
162  {
163  myMarkedVertices.insert( *it );
164  myQueue.push( std::make_pair( *it, d ) );
165  }
166  }
167 }
168 //-----------------------------------------------------------------------------
169 template < typename TGraph, typename TMarkSet >
170 inline
171 void
173 {
174  while ( ! finished() )
175  {
176  Node node = myQueue.front();
177  myQueue.pop();
178  typename MarkSet::iterator mark_it = myMarkedVertices.find( node.first );
179  ASSERT( mark_it != myMarkedVertices.end() );
180  myMarkedVertices.erase( mark_it );
181  }
182 }
183 //-----------------------------------------------------------------------------
184 template < typename TGraph, typename TMarkSet >
185 inline
188 {
189  return myMarkedVertices;
190 }
191 //-----------------------------------------------------------------------------
192 template < typename TGraph, typename TMarkSet >
193 inline
196 {
197  if ( finished() ) return myMarkedVertices;
198  MarkSet visitedVtx = myMarkedVertices;
199  NodeQueue copyQ( myQueue );
200  while ( ! copyQ.empty() )
201  {
202  Node node = copyQ.front();
203  copyQ.pop();
204  typename MarkSet::iterator mark_it = visitedVtx.find( node.first );
205  ASSERT( mark_it != visitedVtx.end() );
206  visitedVtx.erase( mark_it );
207  }
208  return visitedVtx;
209  // JOL: 2012/11/21: Cannot do this since method is const.
210  //
211  // Roll completely the queue so as to remove these vertices from the
212  // set of visited vertices.
213  // Node start = myQueue.front();
214  // do {
215  // Node node = myQueue.front();
216  // myQueue.pop();
217  // typename MarkSet::iterator mark_it = visitedVtx.find( node.first );
218  // ASSERT( mark_it != visitedVtx.end() );
219  // visitedVtx.erase( mark_it );
220  // myQueue.push( node );
221  // } while ( myQueue.front().first != start.first );
222  // return visitedVtx;
223 }
224 
226 // Interface - public :
227 
232 template < typename TGraph, typename TMarkSet >
233 inline
234 void
236 {
237  out << "[BreadthFirstVisitor"
238  << " #queue=" << myQueue.size()
239  << " ]";
240 }
241 
246 template < typename TGraph, typename TMarkSet >
247 inline
248 bool
250 {
251  return true;
252 }
253 
254 
255 
257 // Implementation of inline functions //
258 
259 template < typename TGraph, typename TMarkSet >
260 inline
261 std::ostream&
262 DGtal::operator<< ( std::ostream & out,
263  const BreadthFirstVisitor<TGraph,TMarkSet> & object )
264 {
265  object.selfDisplay( out );
266  return out;
267 }
268 
269 // //
271 
272