电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本
换一换
首页 金锄头文库 > 资源分类 > DOC文档下载
分享到微信 分享到微博 分享到QQ空间

数据结构,最小生成树克鲁斯卡尔算法的实现

  • 资源ID:90115645       资源大小:215KB        全文页数:22页
  • 资源格式: DOC        下载积分:12金贝
快捷下载 游客一键下载
账号登录下载
微信登录下载
三方登录下载: 微信开放平台登录   支付宝登录   QQ登录  
二维码
微信扫一扫登录
下载资源需要12金贝
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
如填写123,账号就是123,密码也是123。
支付方式: 支付宝    微信支付   
验证码:   换一换

 
账号:
密码:
验证码:   换一换
  忘记密码?
    
1、金锄头文库是“C2C”交易模式,即卖家上传的文档直接由买家下载,本站只是中间服务平台,本站所有文档下载所得的收益全部归上传人(卖家)所有,作为网络服务商,若您的权利被侵害请及时联系右侧客服;
2、如你看到网页展示的文档有jinchutou.com水印,是因预览和防盗链等技术需要对部份页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有jinchutou.com水印标识,下载后原文更清晰;
3、所有的PPT和DOC文档都被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;下载前须认真查看,确认无误后再购买;
4、文档大部份都是可以预览的,金锄头文库作为内容存储提供商,无法对各卖家所售文档的真实性、完整性、准确性以及专业性等问题提供审核和保证,请慎重购买;
5、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据;
6、如果您还有什么不清楚的或需要我们协助,可以点击右侧栏的客服。
下载须知 | 常见问题汇总

数据结构,最小生成树克鲁斯卡尔算法的实现

摘 要设计了一个用C/C+编写程序实现克鲁斯卡尔最小生成树算法,该程序操作简单,界面清晰,易于为用户所接受。关键词:克鲁斯卡尔,邻接矩阵,最小生成树,vc+。目 录1 课题描述12 问题分析和任务定义23 逻辑设计34 详细设计45 程序编码106 程序调试与测试167 结果分析188 总结19参考文献201课题描述用C/C+编写程序实现克鲁斯卡尔最小生成树算法。假设要在n个城市之间建立通讯联络网,则连通n个城市只需要n-1条线路。这是我们设计一个最小生成树的程序用来算出最节省经费的前提下建立这个通信站。112问题分析和任务定义 假设连通网N=(V,E),则令最小生成树的初始状态为只有n个顶点而无边的非连通图T=(V,),图中每个顶点自成一个连通分量。在E中选择代价最小的边,若该边依附的顶点落在T中不同的连通分量上,则将此边加入到T中,否则舍去此边而选择下一条代价最小的边。依次类推,直到T中所有顶点都在同一连通分量上为止。203逻辑设计设计思想: 采用邻接矩阵来存储图,然后采用克鲁斯卡尔算法求出最小生成树。结构体定义函数模块二(求最小生成树)克鲁斯卡尔算法函数模块一(图的创建)采用邻接矩阵做存储结构主函数引用函数模块一、二,实现算法设计1)定义结构体。2)采用邻接矩阵做存储结构创建图(函数模块一)。3)采用克鲁斯卡尔算法求出该图的最小生成树(函数模块二)。4)在主函数里面分别调用以上各个函数,最终实现设计目的。4详细设计4.1程序结构·函数CreateMGraph用来实现图的创建,以及图的相关信息的存储。图的存储采用邻接矩阵存储结构。·函数minitree_KRUSKAL 用来求图的最小生成树。图的最小生成树有普利姆算法和克鲁斯卡尔算法可以实现,本段代码使用的是克鲁斯卡尔算法,这也是本题所要求使用的。·各个函数间的联系先调用函数CreateMGraph实现图的创建,然后调用函数minitree_KRUSKAL求出该图的最小生成树4.2设计说明·在开始的时候添加一些限制条件方便函数的功能实现例如:#define MaxVertexNum 100 /最大顶点个数#define QueueSize 30 #define M 30·模块一:图的创建·结构体定义为:typedef structVertexType vexsMaxVertexNum;/顶点表 Link edgesMaxVertexNumMaxVertexNum; /图中当前的相连接的两个顶点int n,e;/图中当前的顶点数和边数MGraph;·函数定义为:MGraph CreateMGraph()MGraph G;int i,j,k,ch3; char ch1,ch2; printf("请输入该图的顶点数和边数:n"); scanf("%d,%d",&(G.n),&(G.e); printf("请输入该图的顶点信息:n"); for(i=1;i<=G.n;i+) getchar();scanf("%c",&(G.vexsi); for(i=1;i<=G.n;i+) for(j=1;j<=G.n;j+) G.edgesij.w=0;printf("请输入该图每条边对应的两个顶点的名称:n"); for(k=1;k<=G.e;k+) scanf("%c",&ch1); printf("请输入第%d条边的顶点序号:",k); scanf("%c %c",&ch1,&ch2);printf("请输入第%d条边的权值大小:",k); scanf("%d",&ch3); for(i=1;ch1!=G.vexsi;i+); for(j=1;ch2!=G.vexsj;j+);ep.vexh=i;ep.vext=j; ep.weight=G.edgesij.w=ch3; /权值 ep.flag=0;p+; return G;流程如图4.1所示创建图使用的是函数MGraph CreateMGraph(),该图的存储结构是邻接矩阵,先对图的结构体进行定义,再进行初始化。在函数中需要手动输入图的参数(如顶点数、边数、顶点信息、相连接的顶点、边的权值等)用来建立图并且确定图的邻接矩阵。最后在完成图的信息输入即建立图以后输出图的邻接矩阵表。·模块二:求图的最小生成树。void minitree_KRUSKAL(MGraph *G) int i,min,j,k;VEX tM; for(i=1;i<=G->n;i+)ti.data=G->vexsi;ti.jihe=i;i=1; while (i<G->n) min=MaxVertexNum; for (j=0;j<G->e;j+) if (ej.weight<min&&ej.flag=0) min=ej.weight; k=j; if (tek.vexh.jihe!=tek.vext.jihe) ek.flag=1; for (j=1;j<=G->n;j+) if (tj.jihe=tek.vext.jihe) tj.jihe=tek.vexh.jihe; tek.vext.jihe=tek.vexh.jihe; i+; else ek.flag=2; printf("克鲁斯卡尔最小生成树:n");for (i=0;i<G->e;i+) if (ei.flag=1) printf("(%d,%d) %dn",ei.vexh,ei.vext,ei.weight);/输出最小生成树该步骤应用的是克鲁斯卡尔算法,它的基本思想是:每次选不属于同一连通分量(保证不生成圈)且边权值最小的顶点,将边加入MST(Minimum Spanning Tree最小生成树),并将所在的2个连通分量合并,直到只剩一个连通分量。 流程如图4.2所示。图4.1图4.25 程序编码#include <stdio.h>#define MaxVertexNum 100 /最大顶点个数#define M 30typedef enumFALSE,TRUEBoolean;Boolean visitedMaxVertexNum; /访问标志数组typedef char VertexType;typedef int EdgeType;typedef struct Lnodeint w;/相应一条边的权值Link;typedef structVertexType vexsMaxVertexNum;/顶点表 Link edgesMaxVertexNumMaxVertexNum; /图中当前的相连接的两个顶点int n,e;/图中当前的顶点数和边数MGraph; typedef struct char data; int jihe; VEX; typedef struct int vexh,vext;/边顶点 int weight;/权值int flag;/标记EDGE; EDGE eM; int p=0;/*图邻接矩阵的建立*/ MGraph CreateMGraph()MGraph G;int i,j,k,ch3; char ch1,ch2; printf("请输入该图的顶点数和边数:n"); scanf("%d,%d",&(G.n),&(G.e); while(G.e>(G.n-1)*G.n/2)printf("输入错误,请重新输入:n"); scanf("%d,%d",&(G.n),&(G.e); printf("请输入该图的顶点信息:n"); for(i=1;i<=G.n;i+) getchar();scanf("%c",&(G.vexsi); for(i=1;i<=G.n;i+) for(j=1;j<=G.n;j+) G.edgesij.w=0;printf("请输入该图每条边对应的两个顶点的名称:n"); for(k=1;k<=G.e;k+) scanf("%c",&ch1); printf("请输入第%d条边的顶点序号:",k); scanf("%c %c",&ch1,&ch2);printf("请输入第%d条边的权值大小:",k); scanf("%d",&ch3); for(i=1;ch1!=G.vexsi;i+); for(j=1;ch2!=G.vexsj;j+);ep.vexh=i;ep.vext=j; ep.weight=G.edgesij.w=ch3; /权值 ep.flag=0;p+; return G;/*克鲁斯卡尔最小生成树*/ void minitree_KRUSKAL(MGraph *G) int i,min,j,k;VEX tM; for(i=1;i<=G->n;i+)ti.data=G->vexsi;ti.jihe=i;i=1; w

注意事项

本文(数据结构,最小生成树克鲁斯卡尔算法的实现)为本站会员(小**)主动上传,金锄头文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即阅读金锄头文库的“版权提示”【网址:https://www.jinchutou.com/h-59.html】,按提示上传提交保证函及证明材料,经审查核实后我们立即给予删除!

温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.