- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
深度优先遍历DFS
第6章 图 1/12 §6.4 图的遍历 [问题] 采用什么策略,可以不遗漏地“走遍”图的每个顶点? ——图的遍历。 [迷宫探索] 有一个地下通道迷宫,通道(假设它都是直的)所有交叉点(包括通道的端点)上都有一盏灯和一个开关。请问如何从某个起点开始在迷宫中点亮所有的灯并回到起点? ? 以什么样的策略,走遍下图迷宫的所有通道的交叉点(顶点0-7)? 第6章 图 §6.4.1 迷宫探索 (1) (3) (5) (7) (2) (4) (6) (8) ? Tremaux探索迷宫的交叉点点灯的次序为0-2-6-4-3-5-7-1;这也就是迷宫对应的图从0号顶点开始的“深度优先搜索”的遍历顺序。 2/12 第6章 图 §6.4.2 深度优先搜索 ? 深度优先搜索(Depth First Search,简称DFS ) ? DFS类似于树的先序遍历 Tremaux探索迷宫就是一种DFS;只不过: 用一个堆栈代替线绳记录走过来的路径; 用一个顶点数组代替交叉点的灯,以记住访问过的顶点。 C D B A H G E F 1 2 3 4 5 6 7 8 【例】一个无向图的DFS(也可以用于有向图) E → A → B → C → D → F → G → H 3/12 第6章 图 §6.4.2 深度优先搜索 ? 深度优先遍历(DFS)的递归算法 void DFS( Graph G, int V ) { /* 从第V个顶点出发递归地深度优先遍历图G */ VertexType W; Visited[V] = TRUE; VisitFunc(V); /* 访问第V个顶点 */ for( W = FirstAdjV(G, V); W; W = NextAdjV (G, V, W) ) if( !Visited[W] ) DFS(G, W); /* 对V的尚未访问的邻接顶点W递归调用DFS */ } 如果选择邻接表作为数据结构,则算法可以更具体。见P.210-211 ? 时间复杂性:采用邻接矩阵存储结构时,查找所有顶点的邻接点所需时间为O(|V|2); 而采用邻接表时,找邻接点所需时间为O(|E|)。因此,DFS的时间复杂度为O(|V|+|E|) 。 ? 对不连通图,一次调用DFS算法只可以遍历一个连通分量。 4/12 第6章 图 §6.4.3 广度优先搜索 ? 广度优先搜索(Breadth First Search,简称BFS ) ? BFS类似于树的层序遍历 ? 有一个数组用于标志已访问与否,还用一个工作队列 C D B A H G E F 【例】一个无向图的BFS E → A → F → H → B → D → G → C 1 2 5 8 6 3 7 4 工作队列: 5/12 第6章 图 §6.4.3 广度优先搜索 广度优先遍历(BFS)的算法 void BFS ( Graph G ) { /* 按广度优先遍历图G。使用辅助队列Q和访问标志数组Visited */ Queue *Q; VertexType U, V, W; for ( U = 0; U G.n; ++U ) Visited[U] = FALSE; Q = CreatQueue( MaxSize ); /* 创建空队列Q */ for ( U = 0; UG.n; ++U ) if (!Visited[U] ) { /* 若U尚未访问 */ Visited[U] = TRUE; VisitFunc(U); /* 访问U */ AddQ (Q, U); /* U入队列 */ while ( ! IsEmptyQ(Q) ) { V = DeleteQ( Q ); /* 队头元素出队并置为V */ for( W = FirstAdjV(G, V); W; W = NextAdjV(G, V, W) )
文档评论(0)