数据结构 第六章 图-3

广度优先搜索:

越早被访问到的顶点,其邻居越优先被选用。

在所有已访问到的顶点仍有邻居尚未访问者,构成所谓的波峰集。BFS搜索过程可理解为:反复从波峰集中找到最早被访问到的顶点v,若其邻居均已访问到,则将其逐出波峰集;否则,随意选出一个尚未访问到的邻居,并将其加入波峰集中。

步骤:

  1. 访问顶点s
  2. 依次访问s所有尚未访问邻接顶点
  3. 依次访问它们尚未访问邻接顶点
  4. 如此反复。。。

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)

发布了85 篇原创文章 · 获赞 17 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/lun55423/article/details/104142583
今日推荐