DGtal  0.6.devel
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
DepthFirstVisitor.ih
1 
32 
33 #include <cstdlib>
35 
37 // IMPLEMENTATION of inline methods.
39 
41 // ----------------------- Standard services ------------------------------
42 
43 //-----------------------------------------------------------------------------
44 template < typename TGraph, typename TMarkSet >
45 inline
47 {
48 }
49 //-----------------------------------------------------------------------------
50 template < typename TGraph, typename TMarkSet >
51 inline
54  : myGraph( g )
55 {
56 }
57 //-----------------------------------------------------------------------------
58 template < typename TGraph, typename TMarkSet >
59 inline
61 ::DepthFirstVisitor( const Graph & g, const Vertex & p )
62  : myGraph( g )
63 {
64  myMarkedVertices.insert( p );
65  myQueue.push( std::make_pair( p, 0 ) );
66 }
67 //-----------------------------------------------------------------------------
68 template < typename TGraph, typename TMarkSet >
69 template <typename VertexIterator>
70 inline
73  VertexIterator b, VertexIterator e )
74  : myGraph( g )
75 {
76  for ( ; b != e; ++b )
77  {
78  myMarkedVertices.insert( *b );
79  myQueue.push( std::make_pair( *b, 0 ) );
80  }
81 }
82 //-----------------------------------------------------------------------------
83 template < typename TGraph, typename TMarkSet >
84 inline
87 {
88  return myGraph;
89 }
90 //-----------------------------------------------------------------------------
91 template < typename TGraph, typename TMarkSet >
92 inline
93 bool
95 {
96  return myQueue.empty();
97 }
98 //-----------------------------------------------------------------------------
99 template < typename TGraph, typename TMarkSet >
100 inline
103 {
104  ASSERT( ! finished() );
105  return myQueue.top();
106 }
107 //-----------------------------------------------------------------------------
108 template < typename TGraph, typename TMarkSet >
109 inline
110 void
112 {
113  ASSERT( ! finished() );
114  myQueue.pop();
115 }
116 //-----------------------------------------------------------------------------
117 template < typename TGraph, typename TMarkSet >
118 inline
119 void
121 {
122  ASSERT( ! finished() );
123  Node node = myQueue.top();
124  Size d = node.second + 1;
125  myQueue.pop();
126  VertexList tmp;
127  tmp.reserve( myGraph.bestCapacity() );
128  std::back_insert_iterator<VertexList> write_it = std::back_inserter( tmp );
129  myGraph.writeNeighbors( write_it, node.first );
130  for ( typename VertexList::const_iterator it = tmp.begin(),
131  it_end = tmp.end(); it != it_end; ++it )
132  {
133  typename MarkSet::const_iterator mark_it = myMarkedVertices.find( *it );
134  if ( mark_it == myMarkedVertices.end() )
135  {
136  myMarkedVertices.insert( *it );
137  myQueue.push( std::make_pair( *it, d ) );
138  }
139  }
140 }
141 //-----------------------------------------------------------------------------
142 template < typename TGraph, typename TMarkSet >
143 template <typename VertexPredicate>
144 inline
145 void
147 ( const VertexPredicate & authorized_vtx )
148 {
149  ASSERT( ! finished() );
150  Node node = myQueue.top();
151  Size d = node.second + 1;
152  myQueue.pop();
153  VertexList tmp;
154  tmp.reserve( myGraph.bestCapacity() );
155  std::back_insert_iterator<VertexList> write_it = std::back_inserter( tmp );
156  myGraph.writeNeighbors( write_it,
157  node.first,
158  authorized_vtx );
159  for ( typename VertexList::const_iterator it = tmp.begin(),
160  it_end = tmp.end(); it != it_end; ++it )
161  {
162  typename MarkSet::const_iterator mark_it = myMarkedVertices.find( *it );
163  if ( mark_it == myMarkedVertices.end() )
164  {
165  myMarkedVertices.insert( *it );
166  myQueue.push( std::make_pair( *it, d ) );
167  }
168  }
169 }
170 //-----------------------------------------------------------------------------
171 template < typename TGraph, typename TMarkSet >
172 inline
173 void
175 {
176  while ( ! finished() )
177  {
178  Node node = myQueue.top();
179  myQueue.pop();
180  typename MarkSet::iterator mark_it = myMarkedVertices.find( node.first );
181  ASSERT( mark_it != myMarkedVertices.end() );
182  myMarkedVertices.erase( mark_it );
183  }
184 }
185 //-----------------------------------------------------------------------------
186 template < typename TGraph, typename TMarkSet >
187 inline
190 {
191  return myMarkedVertices;
192 }
193 //-----------------------------------------------------------------------------
194 template < typename TGraph, typename TMarkSet >
195 inline
198 {
199  if ( finished() ) return myMarkedVertices;
200  MarkSet visitedVtx = myMarkedVertices;
201  // Roll completely the queue so as to remove these vertices from the
202  // set of visited vertices.
203  Node start = myQueue.top();
204  do {
205  Node node = myQueue.top();
206  myQueue.pop();
207  typename MarkSet::iterator mark_it = visitedVtx.find( node.first );
208  ASSERT( mark_it != visitedVtx.end() );
209  visitedVtx.erase( mark_it );
210  myQueue.push( node );
211  } while ( myQueue.top().first != start.first );
212  return visitedVtx;
213 }
214 
216 // Interface - public :
217 
222 template < typename TGraph, typename TMarkSet >
223 inline
224 void
226 {
227  out << "[DepthFirstVisitor"
228  << " #queue=" << myQueue.size()
229  << " ]";
230 }
231 
236 template < typename TGraph, typename TMarkSet >
237 inline
238 bool
240 {
241  return true;
242 }
243 
244 
245 
247 // Implementation of inline functions //
248 
249 template < typename TGraph, typename TMarkSet >
250 inline
251 std::ostream&
252 DGtal::operator<< ( std::ostream & out,
253  const DepthFirstVisitor<TGraph,TMarkSet> & object )
254 {
255  object.selfDisplay( out );
256  return out;
257 }
258 
259 // //
261 
262