收藏 分享(赏)

图的深度优先搜索遍历算法分析及其应用.docx

上传人:dzzj200808 文档编号:2636277 上传时间:2018-09-24 格式:DOCX 页数:8 大小:45.62KB
下载 相关 举报
图的深度优先搜索遍历算法分析及其应用.docx_第1页
第1页 / 共8页
图的深度优先搜索遍历算法分析及其应用.docx_第2页
第2页 / 共8页
图的深度优先搜索遍历算法分析及其应用.docx_第3页
第3页 / 共8页
图的深度优先搜索遍历算法分析及其应用.docx_第4页
第4页 / 共8页
图的深度优先搜索遍历算法分析及其应用.docx_第5页
第5页 / 共8页
点击查看更多>>
资源描述

1、重庆邮电大学数学大类专业2008 级数学建模与数学实验 课程设计设计题目: 图的深度优先搜索遍历算法分析及其应用 设计时间: 2010.9.7-2010.9. 12 姓名: 班级: 学号: 指导教师: 设计成绩:图的深度优先搜索遍历算法分析及其应用摘 要:文章介绍了图论,图的基本概念及其图的表示方法。详细的分析了图中以邻接表为存储结构进行的图的深度优先搜索遍历的算法,并且在 VC+环境中实现其算法的过程,对运行记过做了一定量的分析,最后介绍了基于该算法的一些应用。关键词:图;深度优先搜索;遍历;算法图论Graph Theory是数学的一个分支。它以图为研究对象。图论中的图是由若干给定的点及连接

2、两点的线所构成的图形,这种图形通常用来描述某些事物之间的某种特定关系,用点代表事物,用连接两点的线表示相应两个事物间具有这种关系。图(Graph)是一种较线性表和树更复杂的数据结构,图形结构中,结点之间的关系可以是任意的,图中任意两个数据元素之间都可能相关。因此,在研究有关图的问题时,要考虑图中每个顶点的信息,访问图中的各个顶点,而访问图中各个顶点的操作过程即使图的遍历,图的遍历算法是求解图的连通性问题,拓扑排序和求关键路径等算法的基础。1 图的三元组定义图是一个三元组由集合 V,E 和关联函数组成,记为:G=(V ,E,W(G) ) 。其中 V 是顶点的集合,表示 V(G )=V1,V2 ,

3、V3 ,Vn,V() 。是 V 中的点偶对的有穷集,表示为 E(G)=e1,e2,e3em,其中 ei 为或Vj,Vt ,若 ei 为Vj,Vt,称 ei 为以 V j 和 Vt 为端点的无向边;若 ei 为,称 ei 为以 V j为起点,Vt 为终点的有向边;W(G)称为 EVxV 的关联函数。2 图的存储结构 图的存储结构除了要存储图中各个顶点的本身的信息外,同时还要存储顶点与顶点之间的所有关系(边的信息) ,因此,图的结构比较复杂,很难以数据元素在存储区中的物理位置来表示元素之间的关系,但也正是由于其任意的特性,故物理表示方法很多。常用的图的存储结构有邻接矩阵、邻接表、十字链表和邻接多重

4、表。邻接表是图的一种链式存储结构。对图的每个顶点建立一个单链表(n 个顶点建立 n 个单链表) ,第 i 个单链表中的结点包含顶点 Vi 的所有邻接顶点。图 1 无向图 GV1V5V4V3V2该图的 G 的邻接表表示如下:为了便于理解,本文以无向图 G 作为具体示例(如图 1 所示) ,给出以邻接表进行存储的图的数据结构。现将图 G 的各顶点进行编号,其对应的邻接表如图 2 所示:图 2 图 G 的邻接表表示2.1 邻接表的数据结构定义,将图 G 采用邻接表存储。其结构有:#include “iostream.h“int *visited; /存放当前结点是否遍历typedef int *MG

5、raph;/定义一个二维数组存放邻接矩阵,暂不定义矩阵大小,数据元素类型为整型/把矩阵看作数组元素是一维数组的一个一维数组struct ArcNode /定义邻接表中的边结点类型int adjvex; /邻接点位置int weight; /权值ArcNode *nextarc; /指向下一个边结点的链域;struct VNodeint data;ArcNode *nextarc;/邻接表表头结点typedef VNode *adjlist;/邻接矩阵存储方式void InitGraph(MGraph /分配第一维空间int i,j;for(i=0;ie;coutij;if(in|jn|ie;c

6、outij;if(in|jn|iadjvex=j;p-weight=1;p-nextarc=Gi.nextarc;Gi.nextarc=p;/向序号为 j 的链表中插入一个边结点p=new ArcNode;p-adjvex=i;p-weight=1;p-nextarc=Gj.nextarc;Gj.nextarc=p;3 图的 DFS 遍历图的遍历是从图中的某个顶点出发,沿着某条搜索路径对图中其他顶点访问且被访问一次。通常有两条遍历图的路径:深度优先搜索(Depth First Search)和广度优先搜索(Breadth First Search) 。它们对无向图和有向图均适用。3.1 DFS

7、 遍历的基本思想从图 G 的某个顶点 v0 出发,访问 v0,然后选择一个与 v0 相邻且没被访问过的顶点 vi 访问,再从 vi 出发选择一个与 vi 相邻且未被访问的顶点 vj 进行访问,依次继续。如果当前被访问过的顶点与所有邻接顶点都已被访问,则退回到已被访问顶点序列中最后一个拥有未被访问的相邻顶点的顶点 w,从 w 出发按同样的方法向前遍历,直到图中所有顶点都被访问。3.2 DFS 遍历的具体步骤设开始搜索的定点标号为 1,用 E(T)表示所求图 G 的生成树 T 的边集,以 K 为其序号;V 为正在检查的顶点,W 为待检查的顶点,N(I)为第 I 个顶点的标号。(1) V:=1,K:

8、=1 ,N(1):=1。(2) 寻找没有检验边的关联边。 取与 V 关联的第一条没有检验的边,设为 V,W ,经过此边到达顶点W,规定边 V,W的方向从 V 到 W,转(3) 。 如果没有这样的边,即与顶点 V 关联的每一边都已检测过,转( 4) 。(3)若 W 是未被访问过的顶点,即 N(W)尚未确定,则把边V,W送入边集 E(T) ,令 V:=W,K:=K+1,N(W):=K,转(2 ) 。若 W 是被访问过的顶点,即 N(W )0 ,回到顶点 V 转(2) 。(4)确定集合 T 中指向顶点 V 的边U,V 。找到该边返回到顶点 U,令 V:=U ,转(2) 。没有边U,V则停止。3.3

9、遍历的算法设计结合示例,我们有具体的算法如下:void dfsMGraph(MGraph G,int n,int i)/从第 i 个顶点开始遍历cout“;visitedi=1;for(int j=0;j“;visitedi=true;ArcNode *p=Gi.nextarc;while(p!=NULL)int j=p-adjvex;if(!visitedj)dfsAdj(G,n,j);p=p-nextarc;/根据邻接矩阵得到图的邻接表void graphChange(MGraph gm,adjlist ga,int n)int i,j;for(i=0;iadjvex=j;p-weight

10、=gmij;p-nextarc=gai.nextarc;gai.nextarc=p;4 主程序在给出了数据结构类型和具体操作的算法之后,可以编辑出以下主程序:/主函数void main()int i,n,v;MGraph gm;coutn;visited=new intn;InitGraph(gm,n);CreateGraph(gm,n);adjlist ga;InitAdj(ga,n);graphChange(gm,ga,n);/按图的邻接表得到的深度优先遍历coutv;cout“;dfsAdj(ga,n,v);cout“结束 n“;5.运行结果该程序已经在 Visual C+环境中调试通过

11、,运行时输入的具体数据和相应结果如图 3 所示:图 3 程序运行结果6 DFS 遍历序列结果讨论(1)只给定一个无向图,则 dfs 遍历序列不一定唯一。从图的某顶点 VI 出发进行搜索时,若 VI 的邻接点有多个尚未访问,可任选一个访问。(2)只有确定了图的邻接表的内容及起始顶点,dfs 遍历序列才能唯一。因为邻接点域的内容与建表时的输入次序相关。7 基于 DFS 算法阿德应用(1)求无向图中连通分量的个数。求解该问题只要在算法 dfsAdj 中加入一个计数器 count,每调用一次 dfs后,使 count 加 1,最后 count 的值就是无向图中连通分量的个数。(2)求解无向图中通过给定

12、顶点 VI 的简单回路的算法。8 结论综上所述,图的结构比较发杂,在遍历图的 DFS 算法和程序时,关键要掌握他的遍历思想,并且能使用一些编程技巧和经验对程序优化,在完全理解DFS 算法的基础上,再解决图的有关应用问题就容易多了。参考文献:(1)严蔚敏,吴伟民。数据结构。清华大学出版社。1997:1602178.(2)胡学钢。数据结构算法设计指导,清华大学出版社。1999:1982216。(3)Robert Sedgewick Algorithms In C, Third Edition人民邮电出版社,2003,22 (2):1-2(4)朱战立,李文,数据结构,西安交通大学出版社,199711

13、59-175.(5)余祥宣,计算机算法基础(第二版)华中科技大学出版社,2000.27-29.9 总结在这次课程设计中,我和搭档选择了关于图的深度优先搜索遍历的算法分析及其应用,刚开始的时候,根本就不懂何为深度优先搜索遍历,通过查找相关的资料和书本,在数据结构这本书上,我们看到了图的深度优先搜索相关内容并且通过学习基本的指导图的深度优先搜索遍历时什么一回事情,并且结合老师给的资料进一步的探索学习。通过学习书本和请教相关的同学我们理解了图的深度优先搜索遍历的一般原理和基本实现方法。把学过的计算机编译原理的知识强化,能够把相关算法通过自己设计的程序表示出来,加深了对理论知识的理解。在设计的过程中遇

14、到问题,可以说得是困难重重,不了解命题是首要的,其次对相关的编程知识掌握的不是很牢固,这样势必会花大量的时间在编程的摸索上,我主要的工作是对程序进行调试,发现问题,解决问题和对文章的最后编写。首先按照老师的资料上的程序调试出现了很多的错误,通过解决,最终只剩下了一个问题,但我们查找很多书本资料都很难理解为什么要如此编写程序,要为什么会出现这样的错误。实验调试了很多次,还是没能解决问题,我们就决定换一种编程思想对相关的算法进行编译,结果得到了我们想要的结果。在设计的过程中我发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,通过这次课程设计之后,一定把以前所学过的知识重新温故,另外,资料上也有部分知识不太清楚,于是我又不得不边学边用。整个设计我基本上还满意,由于水平有限,难免会有错误,还望老师批评指正。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报