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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

数据结构kruskal算法求最小生成树.docx

1、数据结构kruskal算法求最小生成树、问题简述题目:图的操作。要求:用 kruskal 算法求最小生成树。最短路径: 输入任意源点,求到其余顶点的最短路径。输入任意对顶点,求这两点之间的最短路径和所有路径。二、程序设计思想 首先要确定图的存储形式。经过的题目要求的初步分析,发现该题的主要操作是路径 的输出,因此采用边集数组(每个元素是一个结构体,包括起点、终点和权值)和邻接矩阵 比较方便以后的编程。其次是 kruskal 算法。该算法的主要步骤是:GENERNIC-MIT(G,W)1.A 2.while A 没有形成一棵生成树3 do 找出 A 的一条安全边 (u,v);4. AA (u,v

2、);5. return A算法设置了集合 A,该集合一直是某最小生成树的子集。在每步决定是否把边 (u,v) 添加到集合 A 中,其添加条件是 A (u,v) 仍然是最小生成树的子集。我们称这样的边为 A 的安全边,因为可以安全地把它添加到 A 中而不会破坏上述条件。然后就是 Dijkstra 算法。 Dijkstra 算法基本思路是:假设每个点都有一对标号 (dj, pj),其中dj是从起源点 s到点j 的最短路径的长度 ( 从 顶点到其本身的最短路径是零路 (没有弧的路 ) ,其长度等于零 );pj则是从 s到j 的最短路 径中 j 点的前一点。求解从起源点 s 到点 j 的最短路径算法的

3、基本过程如下:1)初始化。起源点设置为: ds=0, p s为空; 所有其他点 : d i=, p i=?; 标记起 源点 s,记 k=s, 其他所有点设为未标记的。2)检验从所有已标记的点 k 到其直接连接的未标记的点 j 的距离,并设置:dj =min dj , d k+l kjdj 中最小的一个 i :式中, l kj 是从点 k 到 j 的直接连接距离。3)选取下一个点。从所有未标记的结点中,选取di =min dj , 所有未标记的点 j 点 i 就被选为最短路径中的一点,并设为已标记的。4)找到点 i 的前一点。从已标记的点中找到直接连接到点 i 的点 j *,作为前一点 , 设置

4、: i=j *5)标记点 i 。如果所有点已标记,则算法完全推出,否则,记 k=i ,转到 2) 再继续。而程序中 求两点间最短路径算法。其主要步骤是:调用 dijkstra 算法。将 path 中的第“终点”元素向上回溯至起点,并显示出来。 程序结构框图为:三、程序具体实现1、 kruskal 函数: 因为 kruskal 需要一个有序的边集数组,所以要先对边集数组排序。其次,在执 行中需要判断是否构成回路, 因此还另有一个判断函数 seeks ,在 kruskal 中调用 seeks 。2、 dijkstra 函数: 因为从一源到其余各点的最短路径共有 n-1 条,因此可以设一变量 vnu

5、m 作为计数 器控制循环。该函数的关键在于 dist 数组的重新置数。该置数条件是:该顶点示 被访问过,并且新起点到该点的权值加上新起点到源点的权值小于该点原权值。 因此第一次将其设为: if ( sw=0&costuw+distudistw )。但是在实际运行中,发现有些路径的权值为负。经过分析发现,因为在程序中由 32767 代替。若 costuw=32767 ,那么 costuw+distu 肯定溢出主负值,因此 造成权值出现负值。但是如果 costuw=32767 ,那么 distw 肯定不需重新置 数 。 所 以 将 条 件 改 为 : if ( sw=0&costuw+distu0

6、) i=seti;return i;kruskal(edgeset ge,int n,int e)int setMAXE,v1,v2,i,j;for(i=1;in+1;i+) seti=0;i=1;j=1;while(j=e&i=n-1)v1=seeks(set,gej.bv);v2=seeks(set,gej.tv);if(v1!=v2)printf(%d,%d):%dn,gej.bv,gej.tv,gej.w);setv1=v2;i+;j+;void insertsort(edgeset ge,int e)int i,j;for(i=2;i=e;i+)if(gei.wgei-1.w)ge0

7、=gei;j=i-1;while(ge0.wgej.w)gej+1=gej;j-;gej+1=ge0;void dijkstra(int costMAXEMAXE,int distMAXE,int pathMAXE,int sMAXE,int n,int v0)int u,vnum,w,wm;for(w=1;w=n;w+)distw=costv0w;if(costv0w32767)pathw=v0;vnum=1;while(vnum=n-1)wm=32767;u=v0;for(w=1;w=n;w+)if(sw=0&distwwm)u=w;wm=distw;su=1; vnum+;for(w=1

8、;w=n;w+)if(sw=0&distu+costuwdistw&costuw!=32767) distw=distu+costuw;pathw=u;void printpath1(int dist,int path,int s,int n,int v0)int i,k;for(i=1;i=n;i+) if(si=1) k=i;while(k!=v0)printf(%d-,k);k=pathk;printf(%d:%dn,k,disti);elseprintf(%d-%d:32767n,i,v0);void printpath2(int dist,int path,int v0,int v1

9、)int k;k=v1; while(k!=v0)printf(%d-,k);k=pathk;printf(%d:%dn,k,distv1);main()edgeset geMAXE;int costMAXEMAXE,distMAXE,pathMAXE,sMAXE,a,n,e,i,j,k,v0,v1; printf(input the number of point:);scanf(%d,&n);printf(input the number of edges:);scanf(%d,&e);printf(input the edges:n);for(i=1;i=e;i+)scanf(%d,%d

10、,%d,&gei.bv,&gei.tv,&gei.w);printf(please choisen);printf(1.kruskaln );printf( “2.shortpathn ”);printf( “3.shortpath between two pointn ”);printf( “4.exitn ”);scanf(%d,&a);while(a!=4)switch(a)case 1:insertsort(ge,e);kruskal(ge,n,e);break;case 2:printf(input the start point:);scanf(%d,&v0);for(i=1;i=

11、n;i+)for(j=1;j=n;j+)costij=32767;for(k=1;k=e;k+)i=gek.bv;j=gek.tv;costij=gek.w;for(i=1;i=n;i+)si=0;sv0=1;dijkstra(cost,dist,path,s,n,v0); printpath1(dist,path,s,n,v0);break;case 3:printf(input the start point:);scanf(%d,&v0);printf(input the end point:);scanf(%d,&v1);for(i=1;i=n;i+)for(j=1;j=n;j+)co

12、stij=32767;for(k=1;k=e;k+)i=gek.bv;j=gek.tv;costij=gek.w;for(i=1;i=n;i+)si=0;sv0=1;dijkstra(cost,dist,path,s,n,v0);printpath2(dist,path,v0,v1);break;printf(please choisen);printf(1.kruskaln );printf( “2.shortpathn ”);printf( “3.shortpath between two pointn ”);printf( “4.exitn ”);scanf(%d,&a);五、程序调试将

13、如下图输入:653 6依次输入: 6 (六个顶点)10 (十条边)1,2, 61,3, 11,4, 52,3, 52,5, 33,4, 53,5, 63 ,6, 44,6, 25,6, 6显示菜单。 选择 1 输出:(1,3):14,6):22,5):33,6):42,3):5选择 2输入 1 (起点) 输出: 1: 32767 2-1:6 3-1:1 4-1:5 5-3-1:7 6-3-1:5选择 3输入 1 ( 起点 )5 (终点 )输出 :5-3-1:7 选择 4 退出。六、附录3 阶 B_树中,画将序列 3,7,2,1,4,6,8,9,10,5 插入到初始为空的平衡树和 出插入过程,然

14、后依次删除每个元素,画出删除过程。平衡树插入过程如下所示:33337272713332 727LR261 41414 763332 626RR261 47 14714 8887 993332 6RR28281 4816 916 97947 1047 101056RL 3 824 7 91 5 10平衡树删除过程如下所示:6删36删7 63 828282 4 7 9147914 91 5 105 105 106删2 66RR 2 919LR491 48 1048 101 58 1055删1 6删4 6删 6 54 95 9958 108108108删85 9RL 5 99RR5 1010 10删9 5 删 10 5 删5 10B-树的插入过程如下所示:插入 3 3 插入 7 3 7 插入 2 3 插入 1 3 2 7 1 2 7插入43插入 6 3 6插入 8 3 6124 7 12 47 1 2 4 78插入96插入10 6383 8124 791 2 4 7 910插入 5 6381 2 4 5 7 9 10

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

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