第2章 图遍历.pptVIP

  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文档。上传文档
查看更多
第2章 图遍历

第2章 图的遍历;图的遍历(Graph Traversal)的含义:从已给图中的某一顶点出发,沿着一些边访遍图中所有的顶点,且使每个顶点仅被访问一次(注意理解)。 深度优先搜索(Depth First Search):是一个递归过程,有回退过程,它的思想在很多题目当中要用到。 广度优先搜索(Breadth First Search) :是一个分层的搜索过程,没有回退的情况,是非递归的。;2.1 DFS遍历;DFS算法的思想:在访问图中某一起始顶点v后,由v出发,访问它的某一邻接顶点w1;再从w1出发,访问与w1邻接但还没有访问过的顶点w2;然后再从w2出发,进行类似的访问;…;如此进行下去,直至到达所有的邻接顶点都被访问过的顶点u为止;接着,回退一步,回退到前一次刚访问过的顶点,看是否还有其它没有被访问的邻接顶点。如果有,则访问此顶点,之后再从此顶点出发,进行与前述类似的访问;如果没有,就再回退一步进行搜索。重复上述过程,直到连通图中所有顶点都被访问过为止。;以图2.1(a)所示的无向连通图为例解释DFS搜索过程。假设在多个未访问过的邻接顶点中进行选择时,按顶点序号从小到大的顺序进行选择,比如顶点A有3个邻接顶点,即B、D和E,首先选择顶点B进行深度优先搜索。;对图2.1(a)所示的无向连通图,采用DFS思想搜索的过程为(在图(a)中,箭头旁的数字跟下面的序号对应): (1) 从顶点A出发,访问顶点序号最小的邻接顶点,即顶点B; (2) 然后访问顶点B的一个未访问过的邻接顶点,即顶点C; (3) 接着访问顶点C的一个未访问过的邻接顶点,即顶点G; (4) 此时顶点G已经没有未访问过的邻接顶点了,所以回退到顶点C; (5) 回退到顶点C后,顶点C也没有未访问过的邻接顶点了,所以继续回退到顶点B;;(6) 顶点B还有一个未访问过的邻接顶点,即顶点E,所以访问顶点E; (7) 然后访问顶点E的一个未访问过的邻接顶点,即顶点F; (8) 顶点F有两个未访问过的邻接顶点,选择顶点序号最小的,即顶点D,所以访问D; (9) 此时顶点D已经没有未访问过的邻接顶点了,所以回退到顶点F; (10) 顶点F还有一个未访问过的邻接顶点,即顶点H,所以访问顶点H; (11) 然后访问顶点H的一个未访问过的邻接顶点,即顶点I; (12) 此时顶点I已经没有未访问过的邻接顶点了,所以回退到顶点H;;(13) 回退到顶点H后,顶点H也没有未访问过的邻接顶点了,所以继续回退到顶点F; (14) 回退到顶点F后,顶点F也没有未访问过的邻接顶点了,所以继续回退到顶点E; (15) 回退到顶点E后,顶点E也没有未访问过的邻接顶点了,所以继续回退到顶点B; (16) 回退到顶点B后,顶点B也没有未访问过的邻接顶点了,所以继续回退到顶点A;;在图2.1(b)中,每个顶点外侧的数字标明了进行深度优先搜索时各顶点访问的次序,称为顶点的深度优先数。图(b)还给出了访问n个顶点时经过的n-1条边,这n-1条边将n个顶点联结成一个树,称此图为原图的深度优先生成树,该树的根结点就是深度优先搜索的起始顶点。 在图(b)中,为了更加直观地描述该生成树的树形结构,将此生成树改画成图(b)中右图所示的树形形状。;2.1.2 DFS算法的实现及复杂度分析;DFS( 顶点 i ) //从顶点i进行深度优先搜索 { visited[ i ] = 1; //将顶点i的访问标志置为1 p = 顶点i的边链表表头指针; while( p不为空 ) { //设指针p所指向的边结点所表示的边的另一个顶点为顶点j if( 顶点j未访问过 ) { //递归搜索前的准备工作需要在这里写代码 //如例2.1 DFS( 顶点j ); //以下是DFS的回退位置,在很多应用中需要 //在这里写代码,比如求关节点 } p = p-nextarc; //p移向下一个边结点 } };DFS( 顶点 i ) //从顶点i进行深度优先搜索 { visited[ i ] = 1; //将顶点i的访问标志置为1 for( j=0; jn; j++ ) //对其他所有顶点j { //j是i的邻接顶点,且顶点j没有访问过 if( Edge[i][j]==1 !visited[j] ) { //递归搜索前的准备工作需要在这里写代码 //如例2.1 DFS( j ) //从顶点w出发进行DFS搜索 //以下是DFS的回退位置,在很多应用中需要 //在这里写代码,比如求关节点 } } };上述伪代码中,在递归调用DFS前后的两个位置特别重要: 如果需要在递归搜索前做一些准备工作,如例2.1,则需要在DFS递归调用前的

文档评论(0)

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

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

1亿VIP精品文档

相关文档