宽度优先搜索 BFS_第1页
宽度优先搜索 BFS_第2页
宽度优先搜索 BFS_第3页
宽度优先搜索 BFS_第4页
宽度优先搜索 BFS_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、宽度优先搜索BFS宽度优先搜索算法(又称广度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图 的算法的原型。Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想。已知图G=(V,E)和一个源顶点s,宽度优先搜索以一种系统的方式探寻G的边,从而“发现”s所能到 达的所有顶点,并计算s到所有这些顶点的距离(最少边数),该算法同时能生成一棵根为s且包括所有可 达顶点的宽度优先树。对从s可达的任意顶点v,宽度优先树中从s到v的路径对应于图G中从s到v的 最短路径,即包含最小边数的路径。该算法对有向图和无向图同样适用。之所以称之为宽度优先算法,是因为算法

2、自始至终一直通过已找到和末找到顶点之间的边界向外扩 展,就是说,算法首先搜索和s距离为k的所有顶点,然后再去搜索和S距离为k+l的其他顶点。为了保持搜索的轨迹,宽度优先搜索为每个顶点着色:白色、灰色或黑色。算法开始前所有顶点都是 白色,随着搜索的进行,各顶点会逐渐变成灰色,然后成为黑色。在搜索中第一次碰到一顶点时,我们说 该顶点被发现,此时该顶点变为非白色顶点。因此,灰色和黑色顶点都已被发现,但是,宽度优先搜索算 法对它们加以区分以保证搜索以宽度优先的方式执行。若(u,v)E且顶点u为黑色,那么顶点v要么是灰 色,要么是黑色,就是说,所有和黑色顶点邻接的顶点都已被发现。灰色顶点可以与一些白色顶

3、点相邻接, 它们代表着已找到和未找到顶点之间的边界。在宽度优先搜索过程中建立了一棵宽度优先树,起始时只包含根节点,即源顶点s.在扫描已发现顶点 u的邻接表的过程中每发现一个白色顶点v,该顶点v及边(u,v)就被添加到树中。在宽度优先树中,我们 称结点u是结点v的先辈或父母结点。因为一个结点至多只能被发现一次,因此它最多只能有-个父母结 点。相对根结点来说祖先和后裔关系的定义和通常一样:如果u处于树中从根s到结点v的路径中,那么 u称为v的祖先,v是u的后裔。下面的宽度优先搜索过程BFS假定输入图G=(V,E)采用邻接表表示,对于图中的每个顶点还采用了 几种附加的数据结构,对每个顶点uV,其色彩

4、存储于变量coloru中,结点u的父母存于变量nu中。 如果u没有父母(例如u=s或u还没有被检索到),则nu=NIL,由算法算出的源点s和顶点u之间的距 离存于变量du中,算法中使用了一个先进先出队列Q来存放灰色节点集合。其中headQ表示队列Q的 队头元素,Enqueue(Q,v)表示将元素v入队,Dequeue(Q)表示对头元素出队;Adju表示图中和u相邻 的节点集合。procedure BFS(G,S);beginfor 每个节点 uEVG-s dobegincoloruWhite;du8;nu-NIL;end;colorsGray;ds-0;nsNIL;Q-swhile Q知 do

5、beginuheadQ;for每个节点 vEAdju doif colorv=White thenbegincolorvGray;dvdv+1;nvu;Enqueue(Q,v);end;Dequeue(Q);coloruBlack;end;end;图1展示了用BFS在例图上的搜索过程。黑色边是由BFS产生的树枝。每个节点u内的值为du, 图中所示的队列Q是第9-18行while循环中每次迭代起始时的队列。队列中每个结点下面是该结点与源 结点的距离。图1 BFS在一个无向图上的执行过程过程BFS按如下方式执行,第1-4行置每个结点为白色,置du为无穷大,每个结点的父母置为 NIL,第5行置源结点

6、S为灰色,即意味着过程开始时源结点已被发现。第6行初始化ds为0,第7行 置源结点的父母结点为NIL,第8行初始化队列0,使其仅含源结点s,以后Q队列中仅包含灰色结点的 集合。程序的主循环在9-18行中,只要队列Q中还有灰色结点,即那些已被发现但还没有完全搜索其邻接 表的结点,循环将一直进行下去。第10行确定队列头的灰色结点为u。第11-16行的循环考察u的邻接 表中的每一个顶点v。如果v是白色结点,那么该结点还没有被发现过,算法通过执行第13-16行发现该 结点。首先它被置为灰色,距离dv置为du+1,而后u被记为该节点的父母,最后它被放在队列Q的队 尾。当结点u的邻接表中的所有结点都被检索

7、后,第17-18行使u弹出队列并置成黑色。分析在证明宽度优先搜索的各种性质之前,我们先做一些相对简单的工作一分析算法在图G=(V,E)之上 的运行时间。在初始化后,再没有任何结点又被置为白色。因此第12行的测试保证每个结点至多只能迸 人队列一次,因而至多只能弹出队列一次。入队和出队操作需要O(1)的时间,因此队列操作所占用的全部 时间为O(V),因为只有当每个顶点将被弹出队列时才会查找其邻接表,因此每个顶点的邻接表至多被扫描 一次。因为所有邻接表的长度和为Q(E),所以扫描所有邻接表所花费时间至多为O(E)。初始化操作的开 销为O(V),因此过程BFS的全部运行时间为O(V+E),由此可见,宽

8、度优先搜索的运行时间是图的邻接 表大小的一个线性函数。最短路径在本部分的开始,我们讲过,对于一个图G=(V,E),宽度优先搜索算法可以得到从已知源结点sV 到每个可达结点的距离,我们定义最短路径长度6(s,v)为从顶点s到顶点v的路径中具有最少边数的路径 所包含的边数,若从s到v没有通路则为。具有这一距离6(s,v)的路径即为从s到v的最短路径(后文 我们将把最短路径推广到赋权图,其中每边都有一个实型的权值,一条路径的权是组成该路径所有边的权 值之和,目前讨论的图都不是赋权图)。在证明宽度优先搜索计算出的就是最短路径长度之前,我们先看 一下最短路径长度的一个重要性质。引理1设G=(V,E)是一

9、个有向图或无向图,sV为G的任意一个结点,则对任意边(u,v)eE,6(s,v)6(s,v)0证明:我们对一个顶点进入队列Q的次数进行归纳,我们归纳前假设在所有顶点veV,dv6(s,v)成立。归纳的基础是BFS过程第8行当结点s被放入队列Q后的情形,这时归纳假设成立,因为对于任意 结点 veV-s),ds=0=6(s,s)且 dv=6(s,v)0然后进行归纳,考虑从顶点u开始的搜索中发现一白色顶点v,按归纳假设,du6(s,u)。从过程第 14行的赋值语句以及引理1可知dv=du+16(s,u)+16(s,v)然后,结点v被插入队列Q中。它不会再次被插入队列,因为它已被置为灰色,而第13-1

10、6行的then 子句只对白色结点进行操作,这样dv 的值就不会改变,所以归纳假设成立。为了证明dv=6(s,v),首先我们必须更精确地展示在BFS执行过程中是如何对队列进行操作的,下 面一个引理说明无论何时,队列中的结点至多有两个不同的d值。引理3假设过程BFS在图G=(V,E)之上的执行过程中,队列Q包含如下结点,其中v1是队列Q 的头,vr是队列的尾,则 dv.dv1+1 且 dv.dv.+1, i=1,2,.,r-10证明:证明过程是对队列操作的次数进行归纳。初始时,队列仅包含顶点s,引理自然正确。下面进行归纳,我们必须证明在压入和弹出一个顶点后引理仍然成立。如果队列的头七被弹出队列,

11、新的队头为v2(如果此时队列为空,引理无疑成立),所以有dvrdv1+1dv2+1,余下的不等式依然成立, 因此v2为队头时引理成立。要插入一个结点入队列需仔细分析过程BFS,在BFS的第16行,当顶点v 加入队列成为时,队列头v1实际上就是正在扫描其邻接表的顶E,因此有dv 1=dv=du+1=dv1+1,这时同样有 dvdv1+1=du+1=dv=dv 1,余下的不等式 dv6(s,v)=-,根据过程第14行,顶点v不可 能有一个有限的dv值,由归纳可知,不可能有满足下列条件的第一个顶点存在:该顶点的d值被过程的 第14行语句置为叽 因此仅对有有限d值的顶点,第14行语句才会被执行。所以若

12、v是不可达的话,它 将不会在搜索中被发现。证明主要是对由s可达的顶点来说的。设Vk表示和s距离为k的顶点集合,即Vk=veV:O(s,v)=k。 证明过程为对k进行归纳。作为归纳假设,我们假定对于每一个顶点veVk,在BFS的执行中只有某一特 定时刻满足:-结点v为灰色;dv被置为k; 如果v手s,则对于某个ue Vki,nv被置为u;v被插入队列Q中;正如我们先前所述,至多只有一个特定时刻满足上述条件。归纳的初始情形为k=0,此时V0=s,因为显然源结点s是唯一和s距离为0的结点,在初始化过程 中,s被置为灰色,ds被置为0,且s被放人队列Q中,所以归纳假设成立。下面进行归纳,我们须注意除非

13、到算法终止,队列Q不为空,而且一旦某结点u被插入队列,du 和nu都不再改变。根据引理3可知如果在算法过程中结点按次序vl,v2,.,vr被插入队列,那么相应的距 离序列是单调递增的:dv.10根据单调性和dvk(由引理2)和归纳假设,可知如果v能够被 发现,则必在vk-1中的所有结点进入队列之后。由6(s,v)=k,可知从s到v有一条具有k边的通路,因此必存在某结点u e Vk1,且(u,v)E。不失一 般性,设u是满足条件的第一个灰色节点(根据归纳可知集合Vk1中的所有结点都被置为灰色),BFS把每 一个灰色结点放入队列中,这样由第10行可知结点u最终必然会作为队头出现。当已成为队头时,它

14、的 邻接表将被扫描就会发现结点v (结点v不可能在此之前被发现,因为它不与V.(jk-1)中的任何结点相邻 接,否则v不可能属于Vk,并且根据假定,u是和v相邻接的Vk1中被发现的第一个结点)。第13行置v 为灰色,第14行置dv=du+l=k,第 15行置nv为u,第16行把插入队列中。由于v是Vk中的任意 结点,因此证明归纳假设成立。在结束定理的证明前,我们注意到如果veVk,则据我们所知可得nveVk1,这样我们就得到了一 条从s到v的最短路径:即为从s到nv的最短路径再通过边(nv,v)。宽度优先树过程BFS在搜索图的同时建立了一棵宽度优先树,如图1所示,这棵树是由每个结点的n域所表示

15、。 我们正式定义先辈子图如下,对于图G=(V,E),源顶点为s,其先辈子图Gn=(Vn,En)满足:Vn=veV:nv#NILUs且E 尸(nv,v)eE:veVn-s如果V由从s可达的顶点构成,那么先辈子图Gn是一棵宽度优先树,并且对于所有veVn,Gn中 唯一的由s到v的简单路径也同样是G中从s到v的一条最短路径。由于它互相连通,且|E |=|V |-1(由树 的性质),所以宽度优先树事实上就是一棵树,En中的边称为树枝。当BFS从图G的源结点s开始执行后,下面的引理说明先辈子图是一棵宽度优先树。引理4当过程BFS应用于某一有向或无向图G=(V,E)时,该过程同时建立的n域满足条件:其先辈子图 Gn=(Vn,En)是一棵宽度优先树。证明:过程BFS的第15行语句对(u,v)eE且6(s,v)-(即v从s可达)置nv=u,因此V是由V中从v可 达的顶点所组成,由于Gn形成一棵树,所以它包含从s到V中每一结点的唯一路径,由定理1进行归纳, 我们可知其每条路径都是一条最短路径。(证毕)下面的过程将打印出从S到v的最短路径

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论