广度优先搜索课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《广度优先搜索课件.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 广度 优先 搜索 课件
- 资源描述:
-
1、第八章第八章 广度优先搜索广度优先搜索w广度优先搜索的过程广度优先搜索的过程 广度优先搜索算法(又称宽度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想。 广度优先算法的核心思想是:从初始节点开始,应用算符生成第一层节点,检查目标节点是否在这些后继节点中,若没有,再用产生式规则将所有第一层的节点逐一扩展,得到第二层节点,并逐一检查第二层节点中是否包含目标节点。若没有,再用算符逐一扩展第二层的所有节点,如此依次扩展,检查下去,直到发现目标节点为止。即 从图中的某一顶点V0开始,先访
2、问V0; 访问所有与V0相邻接的顶点V1,V2,.,Vt; 依次访问与V1,V2,.,Vt相邻接的所有未曾访问过的顶点; 循此以往,直至所有的顶点都被访问过为止。 这种搜索的次序体现沿层次向横向扩展的趋势,所以称之为广度优先搜索。w广度优先搜索算法描述:广度优先搜索算法描述:int bfs()初始化,初始状态存入队列;队列首指针head=0; 尾指针tail=1;do 指针head后移一位,指向待扩展结点; for (int i=1;i=max;+i) /max为产生子结点的规则数 if (子结点符合条件) tail指针增1,把新结点存入列尾; if (新结点与原已产生结点重复) 删去该结点(
3、取消入队,tail减1); else if (新结点是目标结点) 输出并退出; while(headtail); /队列为空w广度优先搜索注意事项:广度优先搜索注意事项: 1、每生成一个子结点,就要提供指向它们父亲结点的指针。当解出现时候,通过逆向跟踪,找到从根结点到目标结点的一条路径。当然不要求输出路径,就没必要记父亲。 2、生成的结点要与前面所有已经产生结点比较,以免出现重复结点,浪费时间和空间,还有可能陷入死循环。 3、如果目标结点的深度与“费用”(如:路径长度)成正比,那么,找到的第一个解即为最优解,这时,搜索速度比深度搜索要快些,在求最优解时往往采用广度优先搜索;如果结点的“费用”不
4、与深度成正比时,第一次找到的解不一定是最优解。 4、广度优先搜索的效率还有赖于目标结点所在位置情况,如果目标结点深度处于较深层时,需搜索的结点数基本上以指数增长。 下面我们看看怎样用宽度优先搜索来解决八数码问题。 例如图8-1给出广度优先搜索应用于八数码难题时所生成的搜索树。搜索树上的所有结点都标记它们所对应的状态,每个结点旁边的数字表示结点扩展的顺序。粗线条路径表明求得的一个解。从图中可以看出,扩展第个结点,总共生成个结点之后,才求得这个解。此外,直接观察此图表明,不存在有更短走步序列的解。【例例8.1】图8-2表示的是从城市A到城市H的交通图。从图中可以看出,从城市A到城市H要经过若干个城
5、市。现要找出一条经过城市最少的一条路线。图8-2【算法分析算法分析】看到这图很容易想到用邻接距阵来表示,0表示能走,1表示不能走。如图。 首先想到的是用队列的思想。a数组是存储扩展结点的队列,ai记录经过的城市,bi记录前趋城市,这样就可以倒推出最短线路。具体过程如下:(1) 将城市A入队,队首为0、队尾为1。(2)将队首所指的城市所有可直通的城市入队(如果这个城市在队列中出现过就不入队,可用一布尔数组si来判断),将入队城市的前趋城市保存在bi中。然后将队首加1,得到新的队首城市。重复以上步骤,直到搜到城市H时,搜索结束。利用bi可倒推出最少城市线路。w【参考程序参考程序】w#include
6、w#includewusing namespace std;wint ju99=0,0,0,0,0,0,0,0,0,w 0,1,0,0,0,1,0,1,1,w 0,0,1,1,1,1,0,1,1,w 0,0,1,1,0,0,1,1,1,w 0,0,1,0,1,1,1,0,1,w 0,1,1,0,1,1,1,0,0,w 0,0,0,1,1,1,1,1,0,w 0,1,1,1,0,0,1,1,0,w 0,1,1,1,1,0,0,0,1;wint a101,b101;wbool s9; /初始化wint out(int d) /输出过程ww coutchar(ad+64);w while (bd)w
7、 w d=bd;w cout-char(ad+64);w w coutendl;wwvoid doit()ww int head,tail,i; w head=0;tail=1; /队首为0、队尾为1w a1=1; /记录经过的城市w b1=0; /记录前趋城市w s1=1; /表示该城市已经到过w do /步骤2w w head+; /队首加一,出队w for (i=1;i=8;i+) /搜索可直通的城市w if (juaheadi=0)&(si=0) /判断城市是否走过w w tail+; /队尾加一,入队w atail=i;w btail=head;w si=1;w if (i=8) w
8、 w out(tail);head=tail;break; /第一次搜到H城市时路线最短w w w while (headtail);wwint main() /主程序ww memset(s,false,sizeof(s);w doit(); /进行Bfs操作w return 0;w【例例8.2】一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。如:阵列 4 100234500067103456050020456006710000000089有4个细胞。【算法分析算法分析】 从文件中读入m*n矩阵阵列,将其转换为b
9、oolean矩阵存入bz数组中; 沿bz数组矩阵从上到下,从左到右,找到遇到的第一个细胞; 将细胞的位置入队h,并沿其上、下、左、右四个方向上的细胞位置入队,入队后的位置bz数组置为flase;将h队的队头出队,沿其上、下、左、右四个方向上的细胞位置入队,入队后的位置bz数组置为flase; 重复4,直至h队空为止,则此时找出了一个细胞; 重复2,直至矩阵找不到细胞; 输出找到的细胞数。w【参考程序参考程序】w#includewusing namespace std;wint dx4=-1,0,1,0,w dy4=0,1,0,-1;wint bz100100,num=0,n,m; wvoid
10、doit(int p,int q)ww int x,y,t,w,i;w int h10002;w num+;bzpq=0;w t=0;w=1;h11=p;h12=q; /遇到的第一个细胞入队w dow w t+; /队头指针加1w for (i=0;i=0)&(x=0)&(yn)&(bzxy) /判断该点是否可以入队w w w+;w hw1=x;w hw2=y;w bzxy=0;w /本方向搜索到细胞就入队w w while (tw); /直至队空为止wwint main()ww int i,j; w char s100,ch;w scanf(%d%dn,&m,&n);w for (i=0;
11、i=m-1;i+ )w for (j=0;j=n-1;j+ )w bzij=1; /初始化w for (i=0;i=m-1;i+)w w gets(s); w for (j=0;j=n-1;j+)w if (sj=0) bzij=0;w w for (i=0;i=m-1;i+)w for (j=0;j=n-1;j+)w if (bzij)w doit(i,j); /在矩阵中寻找细胞w printf(NUMBER of cells=%d,num);w return 0;w【例例8.3】最短路径(1995年高中组第4 题)如下图所示,从入口(1)到出口(17)的可行路线图中,数字标号表示关卡。现将
12、上面的路线图,按记录结构存储如下图6: 请设计一种能从存储数据中求出从入口到出口经过最少关卡路径的算法。【算法分析算法分析】 该题是一个路径搜索问题,根据图示,从入口(1)到出口(17)可能有多条途径,其中最短的路径只有一条,那么如何找最短路径呢?根据题意,用数组no存储各关卡号,用数组per存储访问到某关卡号的前趋关卡号。其实本题是一个典型的图的遍历问题,我们可以采用图的广度优先遍历,并利用队列的方式存储顶点之间的联系。从入口(1)开始先把它入队,然后把(1)的所有关联顶点都入队,即访问一个顶点,将其后继顶点入队,并存储它的前趋顶点,直到访问到出口(17)。最后,再从出口的关卡号(17)开始
13、回访它的前趋关卡号,直到入口的关卡号(1),则回访的搜索路径便是最短路径。从列表中可以看出出口关卡号(17)的被访问路径最短的是: (17) (16)(19)(18)(1) 由此,我们得到广度优先遍历求最短路径的基本方法如下: 假设用邻接矩阵存放路线图(aij=1表示I与j连通,aij=0表示i与j不连通)。 再设一个队列和一个表示拓展到哪个顶点的指针变量pos。 (1)从入口开始,先把(1)入队,并且根据邻接矩阵,把(1)的后继顶点全部入队,并存储这些后继顶点的前趋顶点为(1);再把pos后移一个,继续拓展它,将其后继顶点入队,并存储它们的前趋顶点,直到拓展到出口(目的地(17); 注意后继
展开阅读全文