44 template <
typename TGraph,
typename TMarkSet >
50 template <
typename TGraph,
typename TMarkSet >
58 template <
typename TGraph,
typename TMarkSet >
65 myQueue.push( std::make_pair( p, 0 ) );
68 template <
typename TGraph,
typename TMarkSet >
69 template <
typename VertexIterator>
73 VertexIterator b, VertexIterator e )
79 myQueue.push( std::make_pair( *b, 0 ) );
83 template <
typename TGraph,
typename TMarkSet >
91 template <
typename TGraph,
typename TMarkSet >
96 return myQueue.empty();
99 template <
typename TGraph,
typename TMarkSet >
104 ASSERT( ! finished() );
105 return myQueue.top();
108 template <
typename TGraph,
typename TMarkSet >
113 ASSERT( ! finished() );
117 template <
typename TGraph,
typename TMarkSet >
122 ASSERT( ! finished() );
123 Node node = myQueue.top();
124 Size d = node.second + 1;
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 )
133 typename MarkSet::const_iterator mark_it = myMarkedVertices.find( *it );
134 if ( mark_it == myMarkedVertices.end() )
136 myMarkedVertices.insert( *it );
137 myQueue.push( std::make_pair( *it, d ) );
142 template <
typename TGraph,
typename TMarkSet >
143 template <
typename VertexPredicate>
147 (
const VertexPredicate & authorized_vtx )
149 ASSERT( ! finished() );
150 Node node = myQueue.top();
151 Size d = node.second + 1;
154 tmp.reserve( myGraph.bestCapacity() );
155 std::back_insert_iterator<VertexList> write_it = std::back_inserter( tmp );
156 myGraph.writeNeighbors( write_it,
159 for (
typename VertexList::const_iterator it = tmp.begin(),
160 it_end = tmp.end(); it != it_end; ++it )
162 typename MarkSet::const_iterator mark_it = myMarkedVertices.find( *it );
163 if ( mark_it == myMarkedVertices.end() )
165 myMarkedVertices.insert( *it );
166 myQueue.push( std::make_pair( *it, d ) );
171 template <
typename TGraph,
typename TMarkSet >
176 while ( ! finished() )
178 Node node = myQueue.top();
180 typename MarkSet::iterator mark_it = myMarkedVertices.find( node.first );
181 ASSERT( mark_it != myMarkedVertices.end() );
182 myMarkedVertices.erase( mark_it );
186 template <
typename TGraph,
typename TMarkSet >
191 return myMarkedVertices;
194 template <
typename TGraph,
typename TMarkSet >
199 if ( finished() )
return myMarkedVertices;
200 MarkSet visitedVtx = myMarkedVertices;
203 Node start = myQueue.top();
205 Node node = myQueue.top();
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 );
222 template <
typename TGraph,
typename TMarkSet >
227 out <<
"[DepthFirstVisitor"
228 <<
" #queue=" << myQueue.size()
236 template <
typename TGraph,
typename TMarkSet >
249 template <
typename TGraph,
typename TMarkSet >
255 object.selfDisplay( out );