42 template <
typename TGraph,
typename TMarkSet >
48 template <
typename TGraph,
typename TMarkSet >
56 template <
typename TGraph,
typename TMarkSet >
63 myQueue.push( std::make_pair( p, 0 ) );
66 template <
typename TGraph,
typename TMarkSet >
67 template <
typename VertexIterator>
71 VertexIterator b, VertexIterator e )
77 myQueue.push( std::make_pair( *b, 0 ) );
81 template <
typename TGraph,
typename TMarkSet >
89 template <
typename TGraph,
typename TMarkSet >
94 return myQueue.empty();
97 template <
typename TGraph,
typename TMarkSet >
102 ASSERT( ! finished() );
103 return myQueue.front();
106 template <
typename TGraph,
typename TMarkSet >
111 ASSERT( ! finished() );
115 template <
typename TGraph,
typename TMarkSet >
120 ASSERT( ! finished() );
121 Node node = myQueue.front();
122 Size d = node.second + 1;
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 )
131 typename MarkSet::const_iterator mark_it = myMarkedVertices.find( *it );
132 if ( mark_it == myMarkedVertices.end() )
134 myMarkedVertices.insert( *it );
135 myQueue.push( std::make_pair( *it, d ) );
140 template <
typename TGraph,
typename TMarkSet >
141 template <
typename VertexPredicate>
145 (
const VertexPredicate & authorized_vtx )
147 ASSERT( ! finished() );
148 Node node = myQueue.front();
149 Size d = node.second + 1;
152 tmp.reserve( myGraph.bestCapacity() );
153 std::back_insert_iterator<VertexList> write_it = std::back_inserter( tmp );
154 myGraph.writeNeighbors( write_it,
157 for (
typename VertexList::const_iterator it = tmp.begin(),
158 it_end = tmp.end(); it != it_end; ++it )
160 typename MarkSet::const_iterator mark_it = myMarkedVertices.find( *it );
161 if ( mark_it == myMarkedVertices.end() )
163 myMarkedVertices.insert( *it );
164 myQueue.push( std::make_pair( *it, d ) );
169 template <
typename TGraph,
typename TMarkSet >
174 while ( ! finished() )
176 Node node = myQueue.front();
178 typename MarkSet::iterator mark_it = myMarkedVertices.find( node.first );
179 ASSERT( mark_it != myMarkedVertices.end() );
180 myMarkedVertices.erase( mark_it );
184 template <
typename TGraph,
typename TMarkSet >
189 return myMarkedVertices;
192 template <
typename TGraph,
typename TMarkSet >
197 if ( finished() )
return myMarkedVertices;
198 MarkSet visitedVtx = myMarkedVertices;
200 while ( ! copyQ.empty() )
202 Node node = copyQ.front();
204 typename MarkSet::iterator mark_it = visitedVtx.find( node.first );
205 ASSERT( mark_it != visitedVtx.end() );
206 visitedVtx.erase( mark_it );
232 template <
typename TGraph,
typename TMarkSet >
237 out <<
"[BreadthFirstVisitor"
238 <<
" #queue=" << myQueue.size()
246 template <
typename TGraph,
typename TMarkSet >
259 template <
typename TGraph,
typename TMarkSet >
265 object.selfDisplay( out );