ed图广度优先搜索应用.docVIP

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

图的广度优先搜索的应用 内容提要 广度优先搜索是分层次搜索,广泛应用于求解问题的最短路径、最少步骤、最优方法等方面。本讲座就最短路径问题、分酒问题、八数码问题三个典型的范例,从问题分析、算法、数据结构等多方面进行了讨论,从而形成图的广度优先搜索解决问题的模式,通过本讲座的学习,能明白什么样的问题可以采用或转化为图的广度优先搜索来解决。在讨论过程中,还同时对同一问题进行了深层次的探讨,进一步寻求解决问题的最优方案。 知识讲解和实例分析 和深度优先搜索一样,图的广度优先搜索也有广泛的用途。由于广度优先搜索是分层次搜索的,即先将所有与上一层顶点相邻接的顶点搜索完之后,再继续往下搜索与该层的所有邻接而又没有访问过的顶点。故此,当某一层的结点出现目标结点时,这时所进行的步骤是最少的。所以,图的广度优先搜索广泛应用于求解问题的最短路径、最少步骤、最优方法等方面。 本次讲座就几个典型的范例来说明图的广度优先搜索的应用。 先给出图的广度优先搜索法的算法描述: 变量名 表示含义 F 队列首指针 R 队列尾指针 W 该层顶结点的数目 数组L 队列 数组b 该结点的前趋指针 数组c 生成该结点的操作数 H 搜索树的层数 G[h] 第h层首结点的位置编号 F:=0;r:=1;L[r]:=初始值; H:=1;w:=1;bb:=true; While bb do begin H:=h+1;g[h]:=r+1; For I:=1 to w do Begin F:=f+1; For t:=1 to 操作数 do Begin ⑴m:=L[f]; {出队列}; ⑵判断t操作对m结点的相邻结点进行操作;能则设标记bj:=0,并生成新结点;不能,则设标记bj:=1; if bj:=0 then {表示有新结点生成} begin for k:=1 to g[h]-1 do if L[k]=新结点 then {判断新扩展的结点是否以前出现过} begin bj:=1;k:=g[h]-1 end; if bj1 then {没有出现过} begin r:=r+1;L[r]:=新结点;{新结点进队列} b[r]:=f;c[r]:=t;{并链接指针,保存操作数} end; end; end; end; w:=r+1-g[h];s:=0;{计算新生成的一层的结点数} for k:=g[h] to r do {在新生成的一层结点中,判断是否有目标结点存在} if L[k]=目标结点 then begin s:=s+1; {累计解的条数} 根据链接指针求出路径; end; if s:0 then begin 输出s条路径; bb:=false; {设程序结束条件} end; end; 例1:最短路径问题 求从任意一个顶点Vi出发,对给出的图,求到达任意顶点Vj(ij)的所有最短路径 [问题分析] 1、首先用邻接表表示此图各端点的邻接关系。 顶点 接邻顶点 个数 1 2 3 4 3 2 1 3 7 3 3 1 2 4 5 4 4 1 3 6 3 5 3 6 7 8 4 6 4 5 8 3 7 2 5 8 3 8 5 6 7 3 2、数据结构 const d:array[1..8,1..4] of byte=((2,3,4,0),(1,3,7,0),(1,2,4,5),(1,3,6,0),(3,6,7,8),(4,5,8,0),(2,5,8,0),(5,6,7,0)) {二维数组存放邻接表} n:array[1..8] of byte=(3,3,4,3,4,3,3,3); {存放邻接顶点数} var L:array[1..64] of byte {队列} F,r:byte {f队头指针,r队尾指针} B:array[1..64] of byte {链接表,表示某一个结点的前趋结点} G:array[1..10] of byte {表示层结点的首结点在队列开始的位置} H:byte {搜索的层次} 由于搜索过的点不再进行搜索,故设置一个数组E[M]为标记,表示结点M是否访问过 e:array[1..8] of 0..1;{用1表示已访问过,0表示还没有访问} c:array[1..8,1..8]of byte; {C[s,j]存储到达目标结点后各最短路径的线路} bb:Boolean {搜索结束标记} 3、算法描述 ⑴设立初值,并令起始结点进队: f:=0

文档评论(0)

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

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

1亿VIP精品文档

相关文档