其他分享
首页 > 其他分享> > 这可能是全网最烂的bfs~~~

这可能是全网最烂的bfs~~~

作者:互联网

**

题目描述

**

广度优先搜索遍历类似于树的按层次遍历的过程。其过程为:假设从图中的某顶点v出发,在访问了v之后依次访问v的各个未曾被访问过的邻接点,然后分别从这些邻接点出发依次访问它们的邻接点,并使“先被访问的顶点的邻接点”先于“后被访问的顶点的邻接点”被访问,直至图中所有已被访问的顶点的邻接点都被访问到。若此时图中尚有顶点未被访问,则另选图中一个未曾被访问的顶点作为起始点。重复上述过程,直至图中所有顶点都被访问到为止。

其算法可以描述如下:

在本题中,读入一个无向图的邻接矩阵(即数组表示),建立无向图并按照以上描述中的算法遍历所有顶点,输出遍历顶点的顺序。

输入

输入的第一行包含一个正整数n,表示图中共有n个顶点。其中n不超过50。

以后的n行中每行有n个用空格隔开的整数0或1,对于第i行的第j个0或1,1表示第i个顶点和第j个顶点有直接连接,0表示没有直接连接。当i和j相等的时候,保证对应的整数为0。

输入保证邻接矩阵为对称矩阵,即输入的图一定是无向图。

输出

只有一行,包含n个整数,表示按照题目描述中的广度优先遍历算法遍历整个图的访问顶点顺序。每个整数后输出一个空格,并请注意行尾输出换行。

样例输入
4
0 0 0 1
0 0 1 1
0 1 0 1
1 1 1 0

样例输出
0 3 1 2
思想:bfs是非递归的搜索遍历,我们在搜索的时候要像树的层次遍历一样一层一层的去完成某个顶点的邻接点的搜索,当一个顶点的邻接点全部遍历完成之后再开始下一层的遍历,方法和上一层的一样。直到所有的结点都遍历完了再退出程序即可。

#include <bits/stdc++.h>
using namespace std;

const int mm=55;

int n;
int a[mm][mm];
int vis[mm];//vis为标记数组
queue <int> qu;//辅助队列
void bfs(int m);
//注意注意,bfs是非递归的!!!
//注意注意,bfs是非递归的!!!
//注意注意,bfs是非递归的!!!
//重要的事情说三遍
main()
{
    cin>>n;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            cin>>a[i][j];
        }
    }
    bfs(0);
}

void bfs(int m)
{
    qu.push(m);//m入队
    vis[m]=1;//标记m已经被访问
    while(qu.size()>0)//此循环为层次遍历
    {
        int u=qu.front();
        
        qu.pop();
        //标记之后的元素可以离开队列,再从邻接矩阵中逐层遍历
        cout<<u<<" ";
        for(int i=0;i<n;i++)
        {
            if(vis[i]!=1 && a[u][i]==1)//若该结点没有被访问过 并且该结点存在弧
            {
                qu.push(i);//则入队
                vis[i]=1;//标记该结点已经被访问
            }
        }
        //遍历完该层之后再取队头元素,退队.
    }
    cout<<endl;
    //题目格式要求 每组数据之间要存在一个换行
    return ;
}


标签:最烂,遍历,int,全网,bfs,访问,邻接,顶点
来源: https://blog.csdn.net/qq_45202835/article/details/96593168