




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、深度优先搜索算法DFS= = = 1.首先选定图的类别(有向图、无向图),再选定图的存储结构,根据输入的顶点或者边建立图;并把相应的邻接表或者邻接矩阵输出; 2.根据已有的邻接矩阵或邻接表用递归方法编写深度优先搜索遍历算法,并输出遍历结果; dfs.rar - 深度优先搜索算法解决八码难题 Draw1Doc.rar - 简单的绘图程序,能画点,直线,多边形等,比较简单= = = =这里的图的深度优先算法利用了栈来实现。 图的深度遍历原则: 1 如果有可能,访问一个领接的未访问的节点,标记它,并把它放入栈中。 2 当不能执行规则 1 时,如果栈不为空,则从栈中弹出一个元素。
2、 3 如果不能执行规则 1 和规则 2 时,则完成了遍历。 代码中的图使用的是Graph 图邻接矩阵法 来表示,其他的表示法请见:Graph 图邻接表法 代码中的Stack为辅助结构,用来记载访问过的节点。栈的详细描述可以见:ArrayStack 栈 ,LinkedStack 栈 。 Vertex表示图中的节点,其中包含访问,是否访问,清除访问标志的方法。 Graph.main:提供简单测试。代码可以以指定下标的节点开始作深度遍历。 代码比较简单,除了Graph.dsf(int i)深度优先遍历算法外没有过多注释。= = = =深度优先搜索 DFS正如算法名称那样,深度优先搜索所遵循的搜索策略
3、是尽可能“深”地搜索图。在深度优先搜索中,对于最新发现的顶点,如果它还有以此为起点而未探测到的边,就沿此边继续汉下去。当结点v的所有边都己被探寻过,搜索将回溯到发现结点v有那条边的始结点。这一过程一直进行到已发现从源结点可达的所有结点为止。如果还存在未被发现的结点,则选择其中一个作为源结点并重复以上过程,整个进程反复进行直到所有结点都被发现为止。和宽度优先搜索类似,每当扫描已发现结点u的邻接表从而发现新结点v时,深度优先搜索将置v的先辈域v为u。和宽度优先搜索不同的是,前者的先辈子图形成一棵树,而后者产生的先辈子图可以由几棵树组成,因为搜索可能由多个源顶点开始重复进行。因此深度优先搜索的先辈子
4、图的定义也和宽度优先搜索稍有不同:G=(V,E),E=(v,v)E:vVvNIL深度优先搜索的先辈子图形成一个由数个深度优先树组成的深度优先森林。E中的边称为树枝。和宽度优先搜索类似,深度优先在搜索过程中也为结点着色以表示结点的状态。每个顶点开始均为白色,搜索中被发现时置为灰色,结束时又被置成黑色(即当其邻接表被完全检索之后)。这一技巧可以保证每一顶点搜索结束时只存在于一棵深度优先树上,因此这些树都是分离的。除了创建一个深度优先森林外,深度优先搜索同时为每个结点加盖时间戳。每个结点v有两个时间戳:当结点v第一次被发现(并置成灰色)时记录下第一个时间戳dv,当结束检查v的邻接表时(并置v为黑色)
5、记录下第二个时间截fv。许多图的算法中都用到时间戳,他们对推算深度优先搜索进行情况是很有帮助的。下列过程DFS记录了何时在变量du中发现结点u以及何时在变量fu中完成对结点u的检索。这些时间戳为1到2|V|之间的整数,因为对每一个v中结点都对应一个发现事件和一个完成事件。对每一顶点u,有du<fu (1)在时刻du前结点u为白色,在时刻du和fu之间为灰色,以后就变为黑色。下面的伪代码就是一个基本的深度优先搜索算法,输人图G可以是有向图或无向图,变量time是一个全局变量,用于记录时间戳。 procedure DFS(G);- begin- 1 for 每个顶点uVG do- begin
6、- 2 coloruWhite;- 3 uNIL;- end;- 4 time0;- 5 for 每个顶点uVG do- 6 if coloru=White- 7 then DFS_Visit(G,u);- end;- procedure DFS_Visit(G,u);- begin- 1 coloruGray; 白色结点u已被发现- 2 dutimetime+1;- 3 for 每个顶点vAdju do 探寻边(u,v)- 4 if colorv=White - then begin- 5 vu;- 6 DFS_Visit(G,v);- end;- 7 coloruBlack; 完成后置u为
7、黑色- 8 futimetime+1;- end;- 图2说明了DFS在图1所示的图上执行的过程。被算法探寻到的边要么为阴影覆盖 (如果该边为树枝),要么成虚线形式 (其他情况)。对于非树枝的边,分别标明B(或F)以表示反向边、交叉边或无向边。我们用发现时刻Z完成时刻的形式对结点加盖时间戳。图1 一个有向图图图2 深度优先搜索算法DFS在有向图图1上的执行过程过程DFS执行如下。第1-3行把所有结点置为白色,所有域初始化为NIL。第4行复位全局变量time,第5-7行依次检索V中的结点,发现白色结点时,调用DFS_Visit去访问该结点。每次通过第7行调用DFS_Visit时,结点u就成为深度
8、优先森林中一棵新树的根,当DFS返回时,每个结点u都对应于一个发现时刻du和一个完成时刻fu。每次开始调用DFS_Visit(u)时结点u为白色,第1行置u为灰色,第2行使全局时间变量增值并存于du中,从而记录下发现时刻du,第3-6行检查和u相邻接的每个顶点v,且若v为白色结点,则递归访问结点v。在第3行语句中考虑到每一个结点vAdju时,我们可以说边(u,v)被深度优先搜索探寻。最后当以u为起点的所有边都被探寻后,第7-8行语句置u为黑色并记录下完成时间fu。算法DFS运行时间的复杂性如何?DFS中第1-2行和5-7行的循环占用时间为O(V),这不包括执行调用DFS_Visit过程语句所耗
9、费的时间。事实上对每个顶点vV,过程DFS_Visit仅被调用一次,因为DFS_Visit仅适用于白色结点且过程首先进行的就是置结点为灰色,在DFS_Visit(v)执行过程中,第3-6行的循环要执行|Adjv|次。因为vV|Adjv| =(E),因此执行过程DFS_Visit中第2-5行语句占用的整个时间应为(E)。所以DFS的运行时间为(V+E)。练:算法设计邮电版 P200Procedure DFS(ga,g,i:integer); Var j:integer;BeginWVisitedi:=true; 访问顶点一出发点For i:=1 to ga.vex.;ast doIf (ga.mxI,j=1) and (not visitedj) Then DFS(ga,j); 从新顶点出发 End.Procedure DFS1(gb,g,i:integer); Var p:link;BeginWrite(gb.adjlisti.first);Visite
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 门窗保洁服务标准操作培训
- 职工入场安全培训课件
- 安徽省宿州市墉桥区2025-2026学年三上数学期末综合测试模拟试题含解析
- 玩滑梯有秩序
- 口腔颌面部肿瘤护理
- 水电工程空间位置关系分析试题及答案
- 设计公司案例分析
- 经济法专科课程试题及答案分析
- 多元化工程经济复习试题及答案
- 超市店长管理营销
- 2025年护士考试心理健康试题及答案
- 旅游法规教程试题及答案
- 工程测量学概述
- 农村小学教师信息技术应用能力提升策略研究:数字化教学资源与实践应用
- 2025-2030中国学生校服行业市场发展分析及前景趋势与投资研究报告
- DB11 T 411.8-2007 体育场馆等级划分及评定 第8部分:篮球馆
- 滴滴管理制度
- 货车挂靠协议合同
- 规模化养猪场非洲猪瘟生物安全防控策略研究
- 2025届天津市十二区重点学校高三下学期毕业联考(一)英语试题(含答案)
- DB44-T 2623-2025 道路工程高韧超薄磨耗层技术规范
评论
0/150
提交评论