首发于 进击的Java新人

图的广度优先搜索

本节课是小密圈《进击的Java新人》第二十一周第二节课。这节课我们来看一下图的遍历的问题。

图的遍历问题,就是指依照连通性,把图中所有的点都访问一遍,而且每个节点只访问一次,不会出现重复访问。

图的程序表达

在这之前,我们得先把图在程序中创建出来。通常,我们都是从控制台上读入数据,建立一个图。仍然以上节课的图为例:

我们可以用边来描述这个图,先输入两个数字,第一个数字 v 代表多少个节点,第二个数字 e 代表多少个边。然后接下来的 e 行,每一行都是一对数字,分别代表每条边的两个端点。例如,上图就可以这样输入:

第一行的7,9,代表了7个顶点,9条边,然后下面的9行,分别描述了每条边的端点。那我们就写一个与此相对应的程序,来创建一个图:

我们通过运行这个程序,并且向控制台上输入上面的图的信息就可以创建一个无向图了。

广度优先搜索

给定图 G 和一个特定的源顶点 s,搜索算法会系统地搜索 G 中的边,用以发现可以从 s 到达的所有顶点,并计算 s 到所有这些可达顶点之间的距离。

为了记录搜索的轨迹,我们先来定义一下顶点分类。在算法执行的过程中,顶点可以分为以下三类,为了方便描述,我们给这三类结点都标上颜色。第一类是尚未访问过的结点,记他们的颜色为白色,第二类是已经访问过,但却没有扩展完的结点,记这类结点的颜色为灰色,第三类是已经访问过,并且已经全部扩展完的结点,记他们的颜色为黑色。

在算法开始之前,所有的顶点都是白色的。当某一个白色结点被搜索以后,就把它的颜色改为灰色,以表示已经该结点已经被发现,但尚未进行下一步扩展。然后再从灰色结点的集合中找到最早被发现的结点,记为 n,所有从 n 能直接到达的白色结点都是下一次扩展时要改为灰色的结点,当这些结点全部变为灰色以后,就可以把 n 的颜色改为黑色,表示 n 是一个已经全部扩展完了的结点。

从灰色结点集合中找到最早被置为灰色的结点并将其改为黑色这个操作,是典型的先进先出,所以可以使用队列来存储灰色结点集合。而一个结是否被发现,也就是区分一个结点是白还是非白只需要一个布尔型的变量(上文的程序中ListHead中的visited变量)就可以了。将上述文字描述的算法使用代码表示,就如下所示:

可见这种搜索算法的特点就是将已发现和未发现顶点之间的边界,沿其广度方向向外扩展,也就是说,算法首先会找到和 s 距离为 k 的所有顶点,然后才会找到和 s 距离为 k+1 的其他顶点。所以这种搜索算法才被称为广度优先搜索。

对于本节中所示的无向图,如果使用几幅图还表示它的广度优先搜索,就是这样的:

图中红色结点代表从队列中取出待扩展的结点,蓝色结点代表目前在队列中的结点,灰色结点代表已经访问过的结点。BFS 的每次扩展都会使离初始结点更远一层的结点被扩展进队。也就是说第1扩 展,会使得与初始结点距离为1的结点进队,而第2次扩展就会使与初始结点距离为2的结点进队,依次类推。

好了。今天就到这里了。

作业:

今天我的例子程序是使用邻接矩阵创建图的,请使用邻接表表示,并完成邻接表的广度优先遍历。

上一节课: 图算法:图的表达

下一节课: 习题课:八数码问题(上)

目录: 课程目录

代开银行存款证明公司宁德代办银行存款证明西安银行定期存单公司衡水制作企业资信证明防城港打印企业资金证明大同定期存单订做襄阳存款证明服务商周口出国留学存款证明公司哈密定期存单怎么打资阳存款证明公司哈密出国留学资金证明代做马鞍山银行存款证明打印台州资金证明制作长沙出国留学资金证明哪家比较好百色银行存款证明供应商陇南订做出国留学存款证明宝鸡打印银行存款证明鹤壁存款证明服务商崇左做银行存款证明南京出国留学存款证明查询普洱出国留学资金证明怎么打印莆田企业资金证明打印重庆出国留学资金证明订做芜湖定制银行存款证明开封定期存单哪家专业威海制作出国留学存款证明烟台定制资信证明白银银行定期存单哪里有咸宁资金证明哪里有崇左银行定期存单哪家专业鹤壁办理资金证明香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声汪小菲曝离婚始末卫健委通报少年有偿捐血浆16次猝死单亲妈妈陷入热恋 14岁儿子报警雅江山火三名扑火人员牺牲系谣言手机成瘾是影响睡眠质量重要因素男子被猫抓伤后确诊“猫抓病”中国拥有亿元资产的家庭达13.3万户高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了男孩8年未见母亲被告知被遗忘张家界的山上“长”满了韩国人?倪萍分享减重40斤方法许家印被限制高消费网友洛杉矶偶遇贾玲何赛飞追着代拍打小米汽车超级工厂正式揭幕男子被流浪猫绊倒 投喂者赔24万沉迷短剧的人就像掉进了杀猪盘特朗普无法缴纳4.54亿美元罚金周杰伦一审败诉网易杨倩无缘巴黎奥运专访95后高颜值猪保姆德国打算提及普京时仅用姓名西双版纳热带植物园回应蜉蝣大爆发七年后宇文玥被薅头发捞上岸房客欠租失踪 房东直发愁“重生之我在北大当嫡校长”校方回应护栏损坏小学生课间坠楼当地回应沈阳致3死车祸车主疑毒驾事业单位女子向同事水杯投不明物质路边卖淀粉肠阿姨主动出示声明书黑马情侣提车了奥巴马现身唐宁街 黑色着装引猜测老人退休金被冒领16年 金额超20万张立群任西安交通大学校长王树国卸任西安交大校长 师生送别西藏招商引资投资者子女可当地高考胖东来员工每周单休无小长假兔狲“狲大娘”因病死亡外国人感慨凌晨的中国很安全恒大被罚41.75亿到底怎么缴考生莫言也上北大硕士复试名单了专家建议不必谈骨泥色变“开封王婆”爆火:促成四五十对测试车高速逃费 小米:已补缴天水麻辣烫把捣辣椒大爷累坏了

代开银行存款证明公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化