图的遍历程序模板–BFS

//图的遍历:DFS 和 BFS



//BFS 伪代码模板


//遍历u所在的连通块

BFS(u) 
{
    //定义队列q 
    queue q;

    将u入队;

    //设置u已被加入过队列 
    inq[u] = true; 

    while(q非空)
    {
        取出队首元素u进行访问;

        //枚举从u能直接到达的顶点v 
        for(从u出发可达的所有顶点v) 
        {
            //如果v未曾加入过队列

            if( inq[v] == false )
            {

                将v入队列;

                //设置v已经加入过队列 
                inq[v]=true; 


            }

        }



    } 





}


//遍历图G 
BFS_traverse(G) 
{
    //枚举G中的所有顶点u

    for(G的所有顶点u) 
    {
        //如果u未曾加入过队列

        if(inq[u] == false )
         {
            //遍历u所在的连通块 
            BFS(u);

         }

    }


}







//BFS 程序具体实现模板


//邻接矩阵版:


//n为顶点数,MAXV为最大顶点数 
int n,G[MAXV][MAXV]; 

//若顶点i曾加入过队列,则inq[i]==true.初值为false

//遍历u所在的连通块

void BFS(int u) 
{
    queue<int> q;
    //将初始点u入队列 
    q.push(u);

    //设置u已经 加入过队列 
    inq[u]=true;

    while(!q.empty())
    {
        int u=q.front();
        q.pop();


        for(int v=0;v<n;v++)
        {
            //如果u的邻接点v未曾加入过队列

            if(inq[v]== false && G[u][v] !=INF ) 
            {
                //将v入队列 
                q.push(v);

                //标记v为已经加入过队列 
                inq[v]=true;


            }

        } 


    }




}


//遍历图G

void BFS_traverse() 
{
    for(int u=0;u<n;u++)
    {
        if(inq[u] == false)
        {
            //遍历u所在的连通块 
            BFS(u);

        }
    }



}





//邻接表版


//图G,adj[u]存放从顶点u出发可以到达的所有顶点 
vector<int> adj[MAXV]; 
//n为顶点数,MAXV为最大顶点数
int n;

//若顶点i曾入过队列,则inq[i]==true.初值为false
bool inq[MAXV]={
  false};


//遍历单个连通块 
void BFS(int u)
{

    queue<int> q;
    q.push(u);

    inq[u]==true;

    while(!q.empty())
    {

        int u=q.front();
        q.pop();

        for(int i=0;i<adj[u].size();i++)
        {
            int v=adj[u][i];

            if(inq[v]==false)
            {
                q.push(v);
                inq[v] = true;


            }


        }



    }










}




//遍历图G

void BFS_traverse() 
{
    //枚举所有顶点

    for(int u=0;u<n;u++)
     {

        if(inq[u] == false )
        {
            //遍历u所在的连通块 
            BFS(u);

        }
     }



}




//加入层 的数据结构


struct Node{

    int v;//顶点编号

    int layer;  //顶点层号 


}; 

vector<Node>    adj[N];


//进而修改的BFS


//s为起始顶点编号 
void BFS(int s) 
{

    //BFS 队列 
    queue<Node> q;

    //起始结点 
    Node start;

    start.v=s;
    start.layer=0;

    //将起始顶点压入队列 
    q.push(start);

    //起始顶点的编号设为已被加入过队列 
    inq[start.v]=true;

    while(!q.empty())
    {
        Node top=q.front();
        q.pop();

        //队首结点的编号 
        int u=top.v;

        for(int i=0;i<adj[u].size();i++)
        {
            int next=adj[u][i];

            next.layer = top.layer+1;

            //如果next的编号未被加入过队列


            if(inq[next.v] == false)
             {

                //将next入队列 
                q.push(next);

                //next 的编号设为已被加入过队列

                inq[next.v]=true; 


             }


        }


    }




}