数据结构与算法分析:图的遍历_第1页
数据结构与算法分析:图的遍历_第2页
数据结构与算法分析:图的遍历_第3页
数据结构与算法分析:图的遍历_第4页
数据结构与算法分析:图的遍历_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第11章图数据结构与算法分析1图的遍历许多应用需要对图中的每个结点恰好访问一次.基于图的拓扑结构,以特定顺序依次访问图中各个顶点是很有用的.例如:人工智能搜索最短路径问题2图的遍历

从图中某个顶点出发游历图,访遍图中其余顶点,并且使图中的每个顶点仅被访问一次的过程。深度优先搜索广度优先搜索遍历应用举例3图的遍历(2)为了保证访问所有顶点:voidgraphTraverse(constGraph*G){for(v=0;v<G->n();v++)G->setMark(v,UNVISITED);//Initializefor(v=0;v<G->n();v++)if(G->getMark(v)==UNVISITED)

doTraverse(G,v);}4

从图中某个顶点V0出发,访问此顶点,然后依次从V0的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和V0有路径相通的顶点都被访问到。一、深度优先搜索遍历图连通图的深度优先搜索遍历5Vw1SG1SG2SG3W1、W2和W3

均为V的邻接点,SG1、SG2和SG3分别为含顶点W1、W2和W3

的子图。访问顶点V:for(W1、W2、W3)

若该邻接点W未被访问,

则从它出发进行深度优先搜索遍历。w2w3w26从上页的图解可见:1.从深度优先搜索遍历连通图的过程类似于树的先根遍历;解决的办法是:为每个顶点设立一个

“访问标志”。2.如何判别V的邻接点是否被访问?7深度优先搜索(2)Cost:(|V|+|E|).8深度优先搜索DFS(1)//DepthfirstsearchvoidDFS(Graph*G,intv){

PreVisit(G,v);//Takeaction

G->setMark(v,VISITED);for(intw=G->first(v);w<G->n();w=G->next(v,w))if(G->getMark(w)==UNVISITED)DFS(G,w);

PostVisit(G,v);//Takeaction}9首先将图中每个顶点的访问标志设为FALSE,之后搜索图中每个顶点,如果未被访问,则以该顶点为起始点,进行深度优先搜索遍历,否则继续检查下一顶点。非连通图的深度优先搜索遍历10图的遍历(2)为了保证访问所有顶点:voidgraphTraverse(constGraph*G){for(v=0;v<G->n();v++)G->setMark(v,UNVISITED);//Initializefor(v=0;v<G->n();v++)if(G->getMark(v)==UNVISITED)

doTraverse(G,v);}11abchdekfgFFFFFFFFFTTTTTTTTTachdkfebgachkfedbg访问标志:访问次序:例如:01234567812二、广度优先搜索遍历图Vw1w8w3w7w6w2w5w4对连通图,从起始点V到其余各顶点必定存在路径。其中,V->w1,V->w2,V->w8

的路径长度为1;V->w7,V->w3,V->w5

的路径长度为2;V->w6,V->w4

的路径长度为3。w1Vw2w7w6w3w8w5w413从图中的某个顶点V0出发,并在访问此顶点之后依次访问V0的所有未被访问过的邻接点,之后按这些顶点被访问的先后次序依次访问它们的邻接点,直至图中所有和V0有路径相通的顶点都被访问到。若此时图中尚有顶点未被访问,则另选图中一个未曾被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。14广度优先搜索(1)除了用队列代替递归栈外,BFS的实现与DFS相似.BFS在进一步深入访问其他顶点前,检查起点的所有邻接点.15BreadthFirstSearch(3)16BreadthFirstSearch(2)voidBFS(Graph*G,intstart,Queue<int>*Q){

intv,w;

Q->enqueue(start);//InitializeQ

G->setMark(start,VISITED);while(Q->length()!=0){//ProcessQ

Q->dequeue(v);

PreVisit(G,v);//Takeaction

for(w=G->first(v);w<G->n();w=G->next(v,w))if(G->getMark(w)==UNVISITED){G->setMark(w,VISITED);Q->enqueue(w);} }}17三、遍历应用举例1.求一条从顶点i到顶点s

的简单路径2.求两个顶点之间的一条路径长度最短的路径181.

求一条从顶点i到顶点s的简单路径abchdekfg求从顶点b到顶点k的一条简单路径。从顶点b

出发进行深度优先搜索遍历。例如:假设找到的第一个邻接点是a,则得到的结点访问序列为:b

adhce

kfg。假设找到的第一个邻接点是c,则得到的结点访问序列为:

b

chdae

kfg,191.

从顶点

i到顶点s,若存在路径,则从顶点

i出发进行深度优先搜索,必能搜索到顶点s。2.

遍历过程中搜索到的顶点不一定是路径上的顶点。结论:3.

由它出发进行的深度优先遍历已经完成的顶点不是路径上的顶点。20void

DFSearch(intv,ints,char*PATH){//从第v个顶点出发递归地深度优先遍历图G,

//求得一条从v到s的简单路径,并记录在PATH中

visited[v]=TRUE;//访问第v个顶点

Append(PATH,getVertex(v));

//第v个顶点加入路径

for(w=FirstAdjVex(v);w!=0&&!found;

w=NextAdjVex(v))

if(w=s){found=TRUE;Append(PATH,w);}

else

if(!visited[w])DFSearch(w,s,PATH); if(!found)Delete(PATH);

//从路径上删除点v

}212.求两个顶点之间的一条路径长度最短的路径

若两个顶点之间存在多条路径,则其中必有一条路径长度最短的路径。如何求得这条路径?22abchdekfg因此,求路径长度最短的路径可以基于广度优先搜索遍历进行,但需

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论