- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* 在算法开始时,所有顶点的标志位清零。 在遍历过程中,当某个顶点被访问时,其标志位就被设置。如果在遍历过程中遇到被设置标记的顶点,就不再访问它。这样可以避免程序遇到回路时陷入无限循环。 doTraverse might be implemented by any of the graph traversals that we are about to discuss. doTravers可以采用我们将要讨论的任意的图遍历方法。 我们将讨论两种遍历方法:深度优先(DFS)和广度优先(BFS) * * Order that nodes are processed: ACEBDF --- 【讲的时候,用前面代码一步一步演示】 队列 * * 可能从V的某一次出发,不能达到s 如八字形状的图,从中间交叉点作为v if (w=s) { found = TRUE; Append(PATH, w); } 大功告成到v的邻居有s,到达最终目标s else if (!visited[w]) DFSearch(w, s, PATH); v还有邻居没有访问,那么从这个邻居开始继续深度遍历 if (!found) Delete (PATH); // 表示v的所有邻居都访问了,但是没有到s,那么v要删除 * 这个题目,代码和解决思路不完整,不讲了 应该用Dijkstra算法,无权图(边权都为1)就是了 * 最基础且重要的操作:遍历 首先要搞清楚的:建立二叉树 * 红色是提高能力 黑色是基本能力 第11章 图 * 图的遍历 许多应用需要对图中的每个结点恰好访问一次. 基于图的拓扑结构,以特定顺序依次访问图中各个顶点是很有用的. 例如: 人工智能搜索 最短路径问题 * 图的遍历 从图中某个顶点出发游历图,访遍 图中其余顶点,并且使图中的每个顶点 仅被访问一次的过程。 深度优先搜索 广度优先搜索 遍历应用举例 * 图的遍历(2) 为了保证访问所有顶点: void graphTraverse(const Graph* G) { for (v=0; vG-n(); v++) G-setMark(v, UNVISITED); // Initialize for (v=0; vG-n(); v++) if (G-getMark(v) == UNVISITED) doTraverse(G, v); } * 从图中某个顶点V0 出发,访问此顶点,然后依次从V0的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和V0有路径相通的顶点都被访问到。 一、深度优先搜索遍历图 连通图的深度优先搜索遍历 * V w1 SG1 SG2 SG3 W1、W2和W3 均为 V 的邻接点,SG1、SG2 和 SG3 分别为含顶点W1、W2和W3 的子图。 访问顶点 V : for (W1、W2、W3 ) 若该邻接点W未被访问, 则从它出发进行深度优先搜索遍历。 w2 w3 w2 * 从上页的图解可见: 1. 从深度优先搜索遍历连通图的过程类似于树的先根遍历; 解决的办法是:为每个顶点设立一个 “访问标志”。 2. 如何判别V的邻接点是否被访问? * 深度优先搜索(2) Cost: ?(|V| + |E|). * 深度优先搜索 DFS(1) // Depth first search void DFS(Graph* G, int v) { PreVisit(G, v); // Take action G-setMark(v, VISITED); for (int w=G-first(v); wG-n(); w = G-next(v,w)) if (G-getMark(w) == UNVISITED) DFS(G, w); PostVisit(G, v); // Take action } * 首先将图中每个顶点的访问标志设为 FALSE, 之后搜索图中每个顶点,如果未被访问,则以该顶点为起始点,进行深度优先搜索遍历,否则继续检查下一顶点。 非连通图的深度优先搜索遍历 * 图的遍历(2) 为了保证访问所有顶点: void graphTraverse(const Graph* G) { for (v=0; vG-n(); v++) G-setMark(v, UNVISITED); // Initialize for (v=0; vG-n(); v++) if (G-getMark(v) == UNVISITED)
文档评论(0)