数据结构,图的遍历_第1页
数据结构,图的遍历_第2页
数据结构,图的遍历_第3页
数据结构,图的遍历_第4页
数据结构,图的遍历_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

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

文档简介

第五章图的遍历吉林大学计算机学院谷方明fmgu2002@图的遍历从图的任一顶点出发,沿着边访遍图中所有顶点,且每个顶点仅访问一次,这一过程称作图的遍历(GraphTraversal)。图的遍历是图的一种基本操作,图的许多其它操作都是建立在遍历的基础之上。分析出发结点:在图结构中,没有一个“自然”的首结点。用户指定。图的连通性:非连通图中,从一个顶点出发,只能访问它所在的连通分量上的所有顶点。用户指定下一个出发点访问其它连通分量。重复访问:访问完某个顶点后可能沿着某些边又回到曾经访问过的顶点。避免重复,用标识数组visited[]。初值为0,标识未访问。如果顶点i被访问,则置visited[i]为1.访问策略:多个邻接顶点,如何选择下一个访问顶点。1.深度优先遍历深度优先遍历又被称为深度优先搜索

(DepthFirstSearch,

DFS

)访问策略:从图中某一起始顶点v出发,访问它的任一邻接顶点w1;再从w1出发,访问与w1邻接但还没有访问过的任一顶点w2;…如此进行下去,直至到达所有的邻接顶点都被访问过的顶点。此时,回溯到上一个被访问的顶点,看它是否还有其它没被访问的邻接顶点。若有,则访问该邻接顶点,进行与前述类似的访问;若没有,进一步回溯。DFS示例ABCFHIEGD123457689ABCFHIEGD123456789搜索回退

深度优先搜索过程 深度优先搜索树递归算法描述算法DepthFirstSearch

(v)/*图的深度优先遍历的递归算法,标识数组visited全局*/D1[初始化]

cout<<v;

visited[v]=1;D2[深度优先遍历] for(p=Head[v]->adjacent;p;p=p->link) if(visited[p->VerAdj]!=1)

DepthFirstSearch(p->VerAdj);▐V1V2V4V3V8V7V6V52345162828373645V1V2V3V4V5V6V7V87112345678V1V2V3V8V7V6V5V4DFS算法分析如果用邻接表表示图,沿顶点的adjacent可以找到某个顶点v的所有邻接顶点w。DFS每个结点只访问一次,由于总共有2e个边结点,所以扫描边的时间为O(e)。而且对所有顶点递归访问1次,所以遍历图的时间复杂性为O(n+e)。如果用邻接矩阵表示图,则查找每一个顶点的所有的边,所需时间为O(n),则遍历图中所有的顶点所需的时间为O(n2)。迭代算法将visited[]值置为0,初始顶点压入栈;检测栈是否为空。若堆栈为空,则迭代结束;否则,从栈顶弹出一个顶点v;如果v未被访问过,则访问v,将visited[v]值更新为1,然后根据v的邻接顶点表,将v的未被访问的邻接顶点压入栈,转到步骤2。迭代算法DFS(v)/*用栈S非递归深度优先遍历图G,G采用邻接表存储,标识数组visited[]*/DFS1.[初始化]

for(i=1;i<=n;i++)visited[i]=0; CREATSTACKS

S.push(v).DFS2.[用S深度优先遍历]while(!S.empty()){

v=

S.pop();

cout<<v;

visited[v]=1;for(p=Head[v]->adjacent;p;p=p->link)

if(visited

[p->VerAdj]==0)S.push(p->VerAdj);

}▐ABCDEFGA1234505640B123CDEFG456

AGFBC访问过⑹ED

AGFB访问过⑸CAGFBCE访问过⑺DAGFBCED访问过⑻

AG访问过⑶FB

A访问过⑵GB

AGF访问过⑷B⑴A非连通图的处理多次调用深度优先遍历算法for(i=1;i<=n;

i++)visited[i]=0;for(i=1;i<=n;

i++)

if(visited[j]==0)

DepthFirstSearch

(i)V1V2V32.广度优先遍历广度优先遍历又称为广度优先搜索(BreadthFirstSearch,BFS)访问策略:首先访问初始点顶点v0,之后依次访问与v0邻接的全部顶点w1,w2,...,wk。然后,再顺次访问与w1,w2,...,wk邻接的尚未访问的全部顶点,再从这些被访问过的顶点出发,逐个访问与它们邻接的尚未访问过的全部顶点。依此类推,直到连通图中的所有顶点全部访问完为止。BFS示例

广度优先搜索过程 广度优先搜素树ABCFHIEGD125346897ABCFHIEGD346897125广度优先搜索是一种分层的搜索过程,每向前走一步可能访问一批顶点,不像深度优先搜索那样有回退的情况。为了实现逐层访问,算法中使用一个队列,以便于向下一层访问。算法BFS(v)/*广度优先遍历算法*/BFS1[初始化] for(i=1;i<=n;i++)visited[i]=0;

CREATQuene

Q;

Q.insert(v);visited[v]=1;BFS2[广度优先遍历]while(!Q.empty()){/*当队列不空时*/

v=Q.delete();/*出队*/cout<<v; for(p=Head[v]->adjacent;p;p=p->link). if(visited[p->VerAdj]==0){

Q.insert

(p->VerAdj);visited[v]=1;}▐01234567001234567123456710011223325644657777012遍历序列01234567234队列Q的变化,上面是队头,下面是队尾。34564567567677BFS算法分析如果使用邻接表表示图,则循环的总时间代价为d0+d1+…+dn-1=O(e),其中的di

是顶点i的度。总的时间复杂度为O(n+e)。如果使用邻接矩阵,则对于每一个被访问的顶点,循环要检测矩阵中的n个元素,总的时间代价为O(n2)。定理5.1DFS每次遍历一个连通分支

Vs={v|v∈V且s->E*v}Vs={v|v∈V且visited[v]=1}集合相等的证明方法下推上:显然上推下:数学归纳法应用1求无向图的连通分支数思想:每遍历一个连通分支,计数加1遍历用深搜和广搜均可应用2判断图中是否有环方法非常多;下面考虑用

温馨提示

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

评论

0/150

提交评论