先广遍历

2021-10-24  本文已影响0人  喜忧参半

算法描述

①将图中所有顶点作“未访问过”标记
②任选图中一个尚未访问过的顶点v作搜索起点
③访问v
④相继地访问与v相邻而尚未访问过的所有节点w_1,w_2……,并依次访问与这些顶点相邻而尚未访问过的所有顶点。反复如此,直至找不到这样的顶点。

先广遍历算法
void bfs()
{
    Eptr p;
    int u,v,w,first,last,q[n]; //q用作队列,first,last是首尾指针
    first=last=0;             //队列初始化
    for (int u=0;u<n;u++)
        L[u].mark=0;          //进队标记初始化
    for(int u=0;u<n;u++)       //找搜索起点 
        if(L[u].mark==0)       //若u未进队,则选作搜索起点
        {
            q[last++]=u;       //u进队
            L[u].mark=1;          //置u进队标记
            while(first!=last)     //当队列不空时
            {
                v=q[first++];      //v出队
                visit(v);            //访问v
                p=L[v].firstedge;    //搜索v的邻接点
                while(p!=NULL)
                {
                    w=p->adjacent;    //w作为v的邻接点
                    if(L[w].mark==0)  //若w未进队
                    {
                        q[last++]=w;    //w进队
                        L[w].mark=1;     //置进队标记
                    }
                    p=p->next;          //找v的下一个邻接点
                }
            }
        }
}

上一篇下一篇

猜你喜欢

热点阅读