2019独角兽企业重金招聘Python工程师标准>>>

1.广度优先搜索遍历类似于树的按层次遍历的过程。

假设从图中某顶点V出发,在访问了V之后依次访问V的各个未曾访问过得邻接点,然后分别从这些邻接点出出发,依次访问他们的邻接点,并使“先被访问的顶点的邻接点”先于“后被访问的顶点的邻接点”被访问。直至图中所有的已被访问的顶点的邻接点都被访问完。若此时图中还有未被访问的顶点,则选一个图中未被访问的顶点做起始点,重复上述广度优先搜索遍历过程,直到所有的顶点被遍历完。

换句话说,广度优先搜索是以v为起始点,由近及远,依次访问和v路径相通且路径长度为1,2,。。。的顶点。

2.以下图为例,做个简单的广度优先搜索的过程

假设以V1顶点为出发点,首先访问V1顶点,然后依次访问V1的邻接点V2,V3,然后以V1的邻接点V2,V3为起始点,分别访问V2的邻接点V4,V5,然后访问V3的邻接点V6,V7;紧接着分别以V4,V5,V6,V7为出发点,首先访问V4的邻接点V8,访问V5的邻接点,V6的邻接点V9,v7的邻接点,此时V8,V9的邻接点都已经被访问完了,此时图的遍历已经结束。

此时的顶点访问顺序为:

V1->V2->V3->V4->V5->V6->V7->V8->V9

3.和深度优先搜索类似,在遍历的过程中也需要一个访问标志数组。并且,为了顺次访问路径长度为2,3的顶点,需附设队列来存储已 被访问的路径长度1,2.。。的顶点;

4.附上代码算法:

example 1: 以队列为辅助

public void BFS1() {boolean[] visited = new boolean[mVexs.length];for (int i = 0; i < mVexs.length; i++) {visited[i] = false;}Queue<Integer> queue =new LinkedList<>();for (int i = 0; i < mVexs.length; i++) {  //遍历各个顶点if (!visited[i]) {visited[i] = true;System.out.println(i + "(" + mVexs[i].data + ")");queue.offer(i);//入队列,选取一个顶点开始进行广度优先搜索}while (queue.isEmpty()) {  //用两个值来表示队列,//出队列int j=queue.poll();ENode node = mVexs[j].firstEdge;while (node != null) {if (!visited[node.ivex]) {visited[node.ivex] = true;queue.offer(node.ivex);//入队列System.out.println(i + "(" + mVexs[node.ivex].data + ")");}node = node.nextEdge;}}}}

example2:以数组来实现队列的辅助 

 public void BFS() {boolean[] visited = new boolean[mVexs.length];for (int i = 0; i < mVexs.length; i++) {visited[i] = false;}int head = 0;//用两个索引的一个int数组来表示辅助队列,用来存取顶点的位置int rear = 0;int[] queue = new int[mVexs.length];for (int i = 0; i < mVexs.length; i++) {  //遍历各个顶点if (!visited[i]) {visited[i] = true;System.out.println(i + "(" + mVexs[i].data + ")");queue[rear++] = i;  //入队列,选取一个顶点开始进行广度优先搜索}while (head != rear) {  //用两个值来表示队列,int j = queue[head++]; //出队列ENode node = mVexs[j].firstEdge;while (node != null) {if (!visited[node.ivex]) {visited[node.ivex] = true;queue[rear++] = node.ivex;  //入队列System.out.println(i + "(" + mVexs[node.ivex].data + ")");}node = node.nextEdge;}}}}

5.时间复杂度

分析上述算法,每个顶点至多进一次队列。遍历图的过程实质上是通过边或者弧找邻接点的过程,因此广度优先搜索遍历图的时间复杂度和深度优先搜索遍历相同。两者不同的地方仅在于对顶点访问时间的顺序不同。

转载于:https://my.oschina.net/u/2263272/blog/1610009

图的遍历——广度优先搜索(Breadth First Search)相关推荐

  1. 图的遍历 --- 广度优先搜索【借助队列实现】 + 深度优先搜索【借助递归栈】

    1. >>图的遍历是指从图中的某一顶点出发,按照某种搜索方法沿着图中的边对图中的所有顶点访问 一次且仅访问一次. 注意:树是一种特殊的图,所以树的遍历实际上也可以看作是一种特殊的图的遍历. ...

  2. 广度优先搜索c语言矩阵,算法7-6:图的遍历——广度优先搜索 (C++代码)

    解题思路: 首先要开一个二维数组储存邻接矩阵,一般的方法是开一个足够大的数组,例如这道题是n不大于50,不过这样做会造成空间不必要的浪费.因此手动分配空间会更为合理.一种方法是用malloc,对应销毁 ...

  3. 深度优先搜索(Depth First Search)、广度优先搜索(Breadth First Search)

    DFS: /* 邻接表存储的图 - DFS */void Visit( Vertex V ) {printf("正在访问顶点%d\n", V); }/* Visited[]为全局变 ...

  4. javascript实现的图数据结构的广度优先 搜索(Breadth-First Search,BFS)和深度优先搜索(Depth-First Search,DFS)...

    最后一例,搞得快.三天之内走了一次.. 下一步,面象对像的javascript编程. function Dictionary(){var items = {};this.has = function ...

  5. 图的遍历——深度优先搜索+广度优先搜索

    一:图的遍历--深度优先搜索 在本文其他内容中只是大体概括了主要的图论内容,更加详细的代码实现及算法分析在此给出. 深度优先搜索(DFS)类似树的先序遍历. 假设初始状态是图中所有顶点未曾被访问,则深 ...

  6. 邻接表形式存储图并且按广度优先搜索遍历的C语言实现

    用邻接表形式存储图并且按广度优先搜索打印遍历结果 #include<stdio.h> #define MAX_VERTEX_NUM 20//最多顶点个数 #define ERROR -1t ...

  7. 广度优先搜索(Breadth-first search)

    广度优先搜索(Breadth-first search) 广度优先搜索简称广搜或者BFS,BFS和DFS一样是一种图算法,dijkstra算法和最小生成树prim算法也有用到BFS的思想.通俗一点讲B ...

  8. 图的遍历(搜索)算法 之 深度优先遍历算法

    图的遍历的定义: 从图中的某个顶点出发访问遍图中的所有顶点,并且每个顶点仅仅被访问一次. 图的遍历算法我们常见的而且用的最多的就有两种:其一是图的深度优先遍历算法:其二是图的广度优先遍历算法.这里我们 ...

  9. 【洛谷】马的遍历--广度优先搜索(BFS)

    题目描述 传送门:https://www.luogu.com.cn/problem/P1443 有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意 ...

最新文章

  1. 数位dp 的简单入门
  2. Kinect学习(六):提取人体关节点数据
  3. mvn install时跳过Test
  4. 使用不可变对象创建值对象
  5. 正则表达式怎样匹配 不包含特定字符串的字符串
  6. 爬虫找工作要掌握什么_找爬虫工作必须掌握scrapy框架究竟什么?
  7. 从入门到入土:Python实现爬取刷新微博推荐和最新好友微博|cookie调用|模拟登录
  8. JavaScript的Array对象使用(1)
  9. 网络管理常用命令(6/14) -netstat命令详解
  10. OpenGL编程指南学习 之一 源码环境运行
  11. Matlab 取整函数
  12. 《高等数学》:推导第七版下册第十章第四节的“利用曲面的参数方程求曲面的面积“
  13. Script.NET 1.0版本的Tcl+Html界面编程原理
  14. 手机上可以拍一寸证件照吗
  15. [转贴]电脑使用者的眼睛保护须知
  16. Github每日精选(第48期):SQLite下的知识库memos
  17. adb 命令模拟点击事件
  18. js html css 图片跑马灯效果(轮播)
  19. hasNext ()和 hasNextLine()区别
  20. 传播延迟与传输延迟以及带宽时延积

热门文章

  1. 函数重载(续)==》函数重载和函数指针在一起
  2. 风清杨之Oracle的安装与说明
  3. php excel类 ,phpExcel使用方法介绍
  4. C#异步编程模式IAsyncResult概述
  5. Java方法,调用,static关键字
  6. 分布式锁原理及实现方式
  7. 堆栈的应用——用JavaScript描述数据结构
  8. Sqoop在导入MySQL数据时遇到Timestamp列为0000-00-00 00:00:00报错
  9. Oracle体系结构之密码文件管理
  10. PHP验证邮箱地址代码