广度优先搜索:
越早被访问到的顶点,其邻居越优先被选用。
在所有已访问到的顶点仍有邻居尚未访问者,构成所谓的波峰集。BFS搜索过程可理解为:反复从波峰集中找到最早被访问到的顶点v,若其邻居均已访问到,则将其逐出波峰集;否则,随意选出一个尚未访问到的邻居,并将其加入波峰集中。
步骤:
- 访问顶点s
- 依次访问s所有尚未访问的邻接顶点
- 依次访问它们尚未访问的邻接顶点
- 如此反复。。。
BFS算法:
template <typename Tv, typename Te>
void Graph<Tv,Te>::bfs( int s ) {
reset(); int clock = 0; int v = s;
do
if ( UNDISCOVERED == status ( v ) )
BFS ( v, clock );
while ( s != ( v = ( ++v % n ) ) );
}
template <typename Tv, typename Te>
void Graph<Tv,Te>::BFS ( int v, int& clock ) {
Queue<int> Q;
status ( v ) = DISCOVERED; Q.enqueue( v );
while ( !Q.empty() ) {
int v = Q.dequeue(); dTime ( v ) = ++clock;
for ( int u = firstNbr ( v ); -1 < u; u = nextNbr ( v, u ))
if ( UNDISCOVERED == status ( u ) ) {
status ( u ) = DISCOVERED; Q.enqueue( u );
type ( v, u ) = TREE; parent ( u ) = v;
} else {
type ( v, u ) = CROSS;
}
status ( v ) = VISITED;
}
}
时间复杂度:O(n+e)