ImageVerifierCode 换一换
格式:DOCX , 页数:66 ,大小:402.02KB ,
资源ID:17827461      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/17827461.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(数据结构课设之图文档格式.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

数据结构课设之图文档格式.docx

1、3 求最小生成树3 有向图的基本操作及应用1 创建有向图的邻接矩阵2 创建有向图的邻接表3 拓扑排序4 有向网的基本操作及应用1 创建有向网的邻接矩阵2 创建有向网的邻接表3 关键路径4 单源最短路径5 每对顶点之间的最短路径实习报告前 言图是一种比线性表和树更为复杂的数据结构。在图形结构中,结点之间的关系可以是任意的,图中任意两个数据元素之间都有可能相关。因此图的应用极为广泛,特别是近年来的迅速发展,已渗入诸如语言学、逻辑学、物理、化学、电讯工程、计算机科学以及数学的其他分支中。要学好图这一章并熟练运用对我来说非常的困难,在这之前,必须学好离散数学中的图的理论,熟练掌握线性表的基本操作和应用

2、,以及栈和队列还有树的相关知识。限于这几章学得并不好,理解的也不透彻,所以在做课程设计时困难重重。尽管遇到很多问题,但在这10天(每天3个小时)的不懈努力下,终于完成了。为此,我简要介绍一下我所使用的工具和资料。编译器:vc6.0;资料:数据结构(C语言版)(严蔚敏 吴伟民 编著),互联网。目录绪 论 程序需求分析第一部分 程序功能运行示例展示 一、无向图的基本操作及应用 1.3无向图的深度优先遍历 1.4无向图的广度优先遍历2、无向网的基本操作及应用 2.3普里姆(Prim)算法求最小生成树三、有向图的基本操作及应用 3.3拓扑排序4、有向图的基本操作及应用 4.3关键路径 4.4单源点最短

3、路径第二部分 程序主要框架设计第三部分 程序主要算法分析(只包含下面几个算法) 一、普里姆(Prim)算法求最小生成树 二、拓扑排序 三、关键路径 四、单源点最短路径第四部分 程序不足及课设心得第五部分 程序代码附上绪 论程序需求分析基础按照要求,需要设计四种图,两种数据存储结构,十六中基本操作及应用,三层以上的显示菜单。图的操作中又包含有有关线性表、栈和队列的基本操作。由于显示菜单已给出,剩下的只是把函数写入其中,而线性表、栈和队列的基本操作并不复杂,很容易实现,我们只有完成图的相关操作即可。图的操作都是以两种存储结构为基础的,邻接矩阵存储结构和邻接表存储结构,如四种图(有向图,有向网,无向

4、图,无向网)的创建,其他的操作都是在四种图创建后才开始进行的。所以,首先必须理解两种存储结构的定义。图的邻接矩阵存储结构即图的数组表示法。用两个数组分别存储数据元素(顶点)的信息和数据元素之间的关系(边或弧)的信息。其优点是以二维数组表示有n个顶点的图时,需存放n顶点的信息和n*n个弧的信息存储量。借助于邻接矩阵容易判定任意两个顶点之间是否有边或弧相连,并容易求各个顶点的度。缺点其时间复杂度是O(n*n),例如,构造一个具有n个顶点和e条边的无向网的时间复杂度为O(n*n+e*n)。图的邻接表存储结构是图的一种链式存储结构。对图中的每个顶点建立一个单链表,每个结点有三个域组成,邻接点域adjv

5、ex(弧尾在邻接表链表中的位序),链域nextarc(下一条弧),数据域info(权值)。还要建立一个邻接表链表,用以存放顶点名data和后继指针firstarc,表头结点以顺序结构的形式存储,便于随机访问任一顶点的单链表。邻接表存储结构的优点在于其时间复杂度小。深度优先遍历基本思想:假设初始状态是图中所有顶点未曾被访问,则深度优先遍历可以从图中某个顶点v出发,访问此顶点,然后依次从v的未被访问的邻接到出发深度优先遍历图,直到图中所有和v有路径相通的顶点都被访问到;若此时图中尚有顶点未被访问,则另选图中一个未曾被访问的顶点作为起始点,重复上述过程,直到图中所有顶点都被访问到为止。广度优先遍历基

6、本思想:假设初始状态是图中所有顶点未曾被访问,则广度优先遍历可以从图中某个顶点v出发,在访问了v之后依次访问v的各个未曾访问过的邻接点,然后分别从这些邻接点出发依次访问它们的邻接点,并使“先被访问的顶点的邻接点”先于“后被访问的顶点的邻接点”被访问,直到图中所有已被访问的顶点的邻接点都被访问到;求无向网的最小生成树问题有两种算法:Prima算法和Kruskal算法。Prima算法是从网中的某个顶点出发,选择与该顶点有路径的所有顶点中路径最小的一条路径,从该最小路径的另一顶点出发,重复上述过程,直至图中所有顶点都被访问完成。Kruskal算法是从网中找出所有路径最小的一条路径,记下已访问该路径的

7、两个顶点,再次从图中找出剩下路径中的最小路径,重复上述过程,直至所有顶点都被访问完成,按访问的顺序依次输出各顶点,即构造了一棵最小生成树。由某个集合上的一个偏序得到该集合的一个全序的操作就叫做拓扑排序。如何进行拓扑排序呢?(1)在有向图中选择一个没有前驱的顶点并输出;(2)在图中删除该顶点和所有以它为尾的弧。重复上述两步,直至全部顶点均已输出,就得到了一个拓扑有序序列。 求关键路径的算法如下(教科书184页):(1) 输入e条弧,建立AOE网的存储结构;(2) 从源点v0出发,令ve0=0,按拓扑有序求其余各顶点的最早发生时间。如果得到的拓扑有序序列中的顶点个数小于网中的顶点数,则说明网中存在

8、环,不能求关键路径,算法终止;否则执行第三步。(3) 从汇点vn出发,令vln-1=ven-1,按逆拓扑有序求其余各顶点的最迟发生时间vli;(4) 根据各顶点的和值,求每条弧的最早开始时间e(s)和最迟开始时间e(s),若某条弧满足条件e(s)=l(s),则为关键活动。从某个源点到其余各顶点的最短路径问题:若从v到vi有弧,则Di为弧上的权值,否则Di为无穷大。显然,长度为Dj=MinDi|vi属于V的路径就是从v出发的长度最短的一条路径。单源最短路径问题迪杰斯特拉(Dijkstra)算法 按路径长度递增的次序产生最短路径算法把V分成两组:S:已求出最短路径的顶点的集合T=V-S:尚未确定最

9、短路径的顶点集合将T中顶点按最短路径长度递增的次序加入到S中,保证:从源点V0到S中各顶点的最短路径长度都不大于从V0到T中任何顶点的最短路径长度每个顶点对应一个距离值 S中顶点:从V0到此顶点的最短路径长度 T中顶点:从V0到此顶点的只包括S中顶点作中间顶点的最短路径长度计算关键路径的几个相关的量:事件Vi的最早发生时间Ve(i)从源点V1 到顶点Vi 的最长路径长度事件Vi的最迟发生时间Vli 在保证汇点Vn 在Ven 时刻发生的前提下,事件Vi 的允许的最晚时间。等于Ven减去vi到vn的最长路径长度。 活动ai的最早开始时间ei设活动ai在边上, 则ei = Vej。活动ai的最迟开始

10、时间li假定活动ai是用边表示的,则ai的最迟开始时间l(i)=vl(k)-dut()。求每一对顶点之间的最短路径:解决这个问题的一个办法是:每次以一个顶点为源点,重复执行迪杰斯特拉算法。这样,便可求得每一对顶点之间的最短路径。总的执行时间为O(n3)。下面我们介绍另一种方法:弗洛伊德算法第一部分程序功能运行示例展示1.3无向图的深度优先遍历实例用图如下:运行最终结果(具体算法请参见算法设计部分):1.4 无向图的广度优先遍历运行最终结果:二、无向网的基本操作及应用2.3普里姆(Prim)算法求最小生成树3.3拓扑排序运行的最终结果:四、有向网的基本操作及应用4.3关键路径4.4单源点最短路径

11、第二部分程序主要框架设计把所有代码都放在同一个源文件中显然是不明智的;因此,必须把各个算法的实现代码放在不同的头文件中,用#include “”包含其中,但这有先后顺序,首先应该包含的是含有状态结果的代码和库文件,其次是栈和队列的基本操作和实现,再就是图的两种存储结构的定义,四种图的创建和显示,然后是基于两种存储结构的各种算法的现,最后应该是三层显示输出菜单。有向图的数据结的定义以及有关操作主函数(基本菜单项框架的设计)无向图的数据结的定义以及向关操作队列数据结构的定义以及向关操作无向网的数据结的定义以及向关操作栈的数据结的定义以及有关操作图的数据结的定义有向网的数据结的定义以及有关操作第三部

12、分程序主要算法分析1、普里姆(Prim)算法求最小生成树普里姆(Prim)算法基本思想假设N=(V,E)是一个具有n个顶点的连通网,T=(U,TE)是所求的最小生成树,其中U是T的顶点集,TE是T的边集。算法从U=u0(u0V),TE=开始重复执行以下操作:在所有uV,vV-U的边(u,v)E中找一条代价最小的边(u0,v0)并入集合TE,同时v0并入U,直到U=V为止。此时TE中必有n-1条边,则T为N的最小生成树。/Prim算法求最小生成树void prim(MGraph &G)/*每一步扫描数组lowcost,在V-U中找出离U最近的顶点,令其为k, 并打印边(k,closestk),然

13、后修改lowcost和closest*/ int i,j,k,min; int lowcostMAXVEX;/存放U顶点中顶点到V-U集合中各顶点的各边上的当前最小权值 int closestMAXVEX; /将其lowcost改为0, 则表示它已加入生成树顶点集合 for (i=2;i=G.vexnum;i+) /*从顶点2开始*/ lowcosti=G.arcs1i;/把弧的权值给数组lowcost closesti=1; /选择从顶点出发,数组的初始状态 closest1=0; /把顶点1加入最小生成树中 cout最小代价生成树的各条边为n;i+) /*从u之外求离u中某一顶点最近的顶点

14、*/ min=MAXCOST; j=1; /从邻接矩阵的第一行开始遍历,求出离头顶点最近的顶点 k=i; while (j=G.vexnum) if (lowcostjmin & closestj!=0) min=lowcostj; /遇到最小权值的边存储在min中 k=j; else j+; printf (%d,%d),closestk,k); /打印边权值最小的边 closestk=0; /* k加入如到最小生成树中 */ for (j=2;jj+) /然后再用刚加入的顶点与其他不为0的顶点依次比较更新权值 if (closestj!=0 & G.arcskjlowcostj) lowc

15、ostj=G.arcskj; closestj=k; 2、拓扑排序拓扑排序AOV网:在有向图中,若用顶点表示活动,弧表示活动之间的先后关系,这种有向图称为顶点表示活动的网简称AOV网。在AOV网中,若从顶点vi到顶点vj有一条有向路径,则vi是vj的前驱,vj是vi的后继。若是网中的一条弧,则vi是vj的直接前驱,vj是vi的直接后继。如果vi是vj的前驱或直接前驱,则活动vi必须在vj开始之前结束,活动vj必须在活动vi结束之后才能开始。/求关键路径int veMAXVEX,v1MAXVEX;int indegreeMAXVEX;int TopoOder(ALGraph G,SqStack

16、&T) int i,j,k,count=0; ArcNode *p; SqStack S; InitStack(S); FindInDegree(G,indegree); for(i=1;i+)/初始化所有点的最早发生时间为零 vei=0; /求各顶点入度i+) /循环执行直至遍历所有点 if(indegreei=0) Push(S,i); while(S.top!=S.base) Pop(S,j); Push(T,j);/j号顶点入栈并计数 count+; for(p=G.verticesj.firstarc;p;p=p-next) k=p-adjvex; indegreek=indegre

17、ek-1; if(indegreek=0) Push(S,k); if(vej+*(p-info)vek)/排序过程中求顶点的vei vek=vej+*(p-info); if(count dut=*(p- if(vlk-dutvlj) vlj=vlk-dut;/事件最小的最晚发生时间cout起点 终点 权值 最早发生时间 最迟发生时间endl;for(j=1;j+)/求ee,el,关键活动for(p=G.verticesj.firstarc; ee=vej;/活动的最早发生时间是前一个事件的最早发生事件 el=vlk-dut;/活动的最晚发生时间是后一个事件减去路上要用的时间 if(ee=e

18、l) coutsetw(4)G.verticesj.dataG.verticesk.datadutsetw(8)eesetw(12)el三、关键路径求关键路径的算法如下:每一次以一个顶点为源点,重复执行从某个源点到其余各顶点的最短路径的算法n次。这样,就可以求得每一对顶点之间的最短路径。四、单源点最短路径Dijkstra提出了一个按路径“长度”递增的次序,逐步得到由给定源点到图的其余各点间的最短路径的算法: 假设我们以邻接矩阵cost表示所研究的有向网。 迪杰斯特拉算法需要一个顶点集合,初始时集合内只有一个源点V0 ,以后陆续将已求得最短路径的顶点加入到集合中,到全部顶点都进入集合了,过程就结

19、束了。集合可用一维数组来表示,设此数组为S,凡在集合S以外的顶点,其相应的数组元素Si 为 0 ,否则为 1 。 另需一个一维数组D,每个顶点对应数组的一个单元,记录从源点到其他各顶点当前的最短路径长度,其初值为Di=costV0i,i=1n。数组D中的数据随着算法的逐步进行要不断地修改定义了S集合和D数组并对其初始化后,迪杰斯特拉算法在进行中,都是从S之外的顶点集合中选出一个顶点w,使Dw的值最小。于是从源点到达w只通过S中的顶点,把 w 加入集合S中,并调整D中记录的从源点到集合中每个顶点v的距离: 取Dv和Dw+costwv中值较小的作为新的Dv重复上述,直到S中包含V中其余各顶点的最短路径。/求单源顶点最短路径 /为实现算法,引入一个辅助数组dist n,/含两个成员length和pre,该数组的第j个元素distj ,/用来保存从源点i到终点j的目前最短路径长度及该路经上的前驱结点。typedef int PathMatrixMAXVEXMAXVEX;/路径矩阵

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1