算法设计与分析 第五章1 图的搜索算法讲解.ppt

算法设计与分析 第五章1 图的搜索算法讲解.ppt

  1. 1、本文档共154页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第五章 图的搜索算法 5.1 图搜索概述 5.1.1 图及其术语 5.1.2 图搜索及其术语 5.2 广度优先搜索 5.2.1 算法框架 5.2.2 广度优先搜索的应用 5.3 深度优先搜索 2.显式图的常用术语 路径与路长:在图 G=( V, E)中,如果存在由不同的边 (v i0, v i1 ), (v i1, v i2 ), …, (v in-1, v in )或是 v i0, v i1 , vi 1, v i 2, …, v in-1, v in )组成的序列,则称顶点 v i0, v in是连通的,顶点序列( v i0, v i1, v i2, …, v in)是从顶点 v i0到顶点 v in的一条道路。路长是道路上边的数目, v i0到 v in的这条道路上的路长为 n。 连通图:对于图中任意两个顶点 v i、 v j ∈V, v i、 v j之间有道路相连,则称该图为连通图。如 5-1中的 ⑴图。 网络:带权的连通图,如图 5-2所示。 3.隐式图术语 1)子集树 4.图的存储 1)邻接矩阵法 2)邻接表 图7.1 5.1.2 图搜索及其术语 2.相关概念和术语 5.2.1 算法框架 2.算法框架 1)邻接表表示图的广度优先搜索算法 2)邻接矩阵表示的图的广度优先搜索算法 5.2.2 广度优先搜索的应用 【例1】已知若干个城市的地图,求从一个城市到另一个城市的路径,要求路径中经过的城市最少 【例2】走迷宫问题 【例1】已知若干个城市的地图,求从一个城市到另一个城市的路径,要求路径中经过的城市最少。 算法设计: 如图5-6表示的是从城市A到城市H的交通图。从图中可以看出,从城市A到城市H要经过若干个城市。现要找出一条经过城市最少一条路线。 具体过程如下: 数据结构设计: 算法如下: 【例2】走迷宫问题 算法设计: 数据结构设计: 检查位置函数 Check(int i,int j) { int flag = 1; if(i1 or i8 or j1 or j8) flag =0;//是否在迷宫内 if(maze[i][j]=1 or maze[i][j]=-1)flag=0;/是否可行 return flag; } 输出路径及算法分析 深度优先遍历首先访问出发点v,并将其标记为已访问过;然后依次从v出发搜索v的每个邻接点w。若w未曾访问过,则以w为新的出发点继续进行深度优先遍历,直至图中所有和源点v有路径相通的顶点均已被访问为止。 若此时图中仍有未访问的顶点,则另选一个尚未访问的顶点作为新的源点重复上述过程,直至图中所有顶点均已被访问为止。 深度搜索与广度搜索的相近,最终都要扩展一个结点的所有子结点. 区别在于对扩展结点过程,深度搜索扩展的是E-结点的邻接结点中的一个,并将其作为新的E-结点继续扩展,当前E-结点仍为活结点,待搜索完其子结点后,回溯到该结点扩展它的其它未搜索的邻接结点。而广度搜索,则是扩展E-结点的所有邻接结点,E-结点就成为一个死结点。 5.3.1 算法框架 1.算法的基本思路 2.算法框架 1.算法的基本思路 算法设计的基本步骤为: 1)确定图的存储方式; 2)遍历过程中的操作,其中包括为输出问题解而进行的存储操作; 3)输出问题的结论。 4)一般在回溯前的应该将结点状态恢复为原始状态,特别是在有多解需求的问题中。 2.算法框架 1)用邻接表存储图的搜索算法 2)用邻接矩阵存储图的搜索算法 graph head[100]; dfs(int k) / head图的顶点数组/ { edgenode *ptr / ptr图的边表指针/ visited[k]=1; /* 记录已遍历过 */ print(“访问 ”,k); /* 印出遍历顶点值 */ ptr=head[k].firstedge; /* 顶点的第一个邻接点 */ while ( ptr NULL ) /* 遍历至链表尾 */ {if ( visited[ptr-vertex]=0) /* 如果没遍历过 */ dfs(ptr-vertex); /* 递归遍历 */ ptr = ptr-nextnode; } /* 下一个顶点 */

文档评论(0)

shuwkb + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档