BFS算法原理和生成树性质证明.docVIP

  1. 1、本文档共12页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
BFS算法原理和生成树性质证明

BFS算法基本思想和证明 以及广度优先树最重要的还有实现 张季伦 本来想直接写证明的,这篇文章的最初主题是证明在无权图下BFS所产生的生成树中由起点(根节点)到任意可达节点的通路(轨道)都是起点到该节点的最短路径。可是后来发现我们的教材实在是对BFS原理和复杂度证明得很少,往往只是写写伪代码然后对复杂度一笔带过,所以干脆这次连同BFS的原理和复杂度一起写出来分享。 在这之前,大家至少需要看得懂以C为借鉴所写的伪代码,以及需要对图论的基础知识有一点了解。 对于对数据结构有了解的同学来说,很容易知道我们一般用邻接表或者邻接矩阵以及十字矩阵来实现图的数据结构。今天在这里我用邻接矩阵实现。 这次也准备放出完整调试后源码给大家参考,语言是C和C++混编的。 Part 1.BFS原理分析: 首先,广度优先搜索算法的目的是探索一个未知连通结构的图,并把这个图的连通性通过其他数据导出。下面来描述一下BFS算法的基本流程。 前期工作: 为了使BFS运行工作更加流畅和有条理,我们为算法结构添加如下辅助数据量。 向量 COLOR[ELEMETS_NUMBER]: 长度为结点个数的向量,用于标明即时结点与已遍历范围的相对位置。 父节点向量SUPER[ELEMENTS_NUMBER]: 长度同上,数据类型为索引类型,标明某一结点的父节点位置。 通路距离向量DISTANCE[ELEMENTS_NUM]: 标识在确定的一个BFS运行实例中起点结点到其他结点的距离。 辅助队列QUEUE: 为了为待遍历的节点提供缓冲。 算法开始: 这时表示以邻接矩阵表示的图的相关边的数据和起点索引已经传入方法。(令索引为index) 第一步:初始化 将所有节点的COLOR值置为white。 将所有节点的SUPER值置为-1。 将所有节点的DISTANCE值置为INF。 将COLOR[index]置为Gray。 将SUPER[index]置为-1。 将DISTANCE[index]置为0。 执行enQueue(start index)。 第二步:循环不变式工作 如果队列不为空,则从队列中弹出一个索引元素temp,对它做以下工作: 考察与temp索引指向节点的所连通的所有节点,然后对所有有联通的并且颜色不是黑色的节点做以下修改: 将所有与temp联通节点的COLOR向量对应值置为Gray。 将所有与temp联通节点的SUPER值置为temp??? 将所有与temp联通节点的DISTANCE对应值设为DISTANCE[temp]+1。 将所有与temp联通节点的压入队列。 最后将temp节点的COLOR值COLOR[temp]置为black。 以上就是BFS的运行流程,下面来解释一下下。 BFS的主要思想是它引入了标记变量“颜色COLOR”来标识节点的遍历状态。我们定义,当一个节点没有被BFS算法发现时,它是白色的;当一个节点被发现,而它的子节点没有被发现时,它是灰色的;当一个节点被发现并且它的子节点也被发现了,他就是黑色的。 这里的父子节点意思是代表一种发现顺序上的时间关系,如果节点A和B连通,且A先于B被发现,那么我们说A节点是B节点的父节点。 简单的说来,黑色节点是出于已遍历范围内部的;灰色节点是出于已遍历和未遍历的节点的分界线;白色节点是在已遍历范围之外的。如图: (其实这个图是有特殊性的,为什么我不用普遍性的图呢?那要等我们证明完以后的问题才知道) 我们对黑色节点和灰色节点已经了解了它们的局部结构,而对于位置连通性的白色节点,它们在这一个确定的状态里相当于是游离的。 BFS算法要求给出一个起点,从这个起点开始对所有的节点遍历探索;于是,在算法开始时,我们将这个起点压入队列,将他的颜色设为灰色,因为此时他的外围全部都是未被发现的节点。同样,对于父节(前驱)点数组和距离数组(设定相应的值起点没有父节点,起点到起点的距离为一)。 接下来,只要队列不为空,就一直从队列中弹出节点元素,并对这个元素做操作;首先,我们考察与这个元素连通且不是黑色的所有节点,然后对这些节点相应的数据做更新。例如: 将这些节点的颜色置为灰色,因为在他们被发现后,它们变成了遍历范围的边界;它们到起点的距离被置为弹出元素到起点距离加一;它们的父节点被设定为弹出的这个元素;最后他们都被压入队列;然后我们把当前弹出的这个节点的颜色设置为黑色,因为在与他联通的子节点都被发现后,他就退回到遍历范围内部了。 在这里给出伪代码: /* G[ELEMETS_NUM][ELEMENTS_NUM]; SUPER[ELEMENTS_NUM]; DISTANCE[ELEMENTS_NUM]; COLOR[ELEMENTS_NUM]; QUEUE; NODE FLAG WITH INDEX :0 , 1 ,2 ...

文档评论(0)

yy558933 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档