- 1、本文档共21页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
数据结构最小生成树课程设计
目录一、课题描述:2二、需求分析3三、总体结构设计4四、各子模块设计5五、编程设计8六、测试结果12七、总结14八、参考文献15附录16一、课题描述:设计一张城市地图,图中的顶点为城市,无向边代表两个城市间的连通关系,边上的权代表公路造价。图中任一对城市都是连通的,用公路把所有城市联系起来,设计可使得工程的总造价最少。二、需求分析根据课设题目要求,拟将整体程序分为三大模块。此三个模块相互独立,没有嵌套调用的情况,以下是三个模块的大体分析:1. 建立一个图,其存储方式可以采用邻接矩阵形式,需要定义两个数组,一个存储城市,一个存储公路,存储公路的数组表明城市间的连通关系和公路的造价;。2.利用kruskal算法求城市地图的最小生成树3.按父亲结点和子女结点集的形式输出生成树中各条边(公路)以及它们的权值(造价),公路总造价最小值。三、总体结构设计功能模块图无向图的建立最小生成树的求解按父结点和子女结点集的形式输出,求最小值,四、各子模块设计1.无向图的建立(初始化)2.用kruskal算法求最小生成树 Y Y3.用冒泡法排序五、编程设计存储结构该函数包含三个结构体,即存储城市、存储公路和存储图的结构体,其结构体分别如下所示:1.顶点和边的存储表示用字符串name表示城市信息,num表示城市的序号。struct node{char name[10];intnum;}vex[20];用整型begin和end表示公路的起点和终点,weight表示公路的造价。typedefstruct{int begin;int end;int weight;}edge;2.图的邻接矩阵存储表示用整型adj表示城市间的关系,weight表示公路的造价。typedefstruct{intadj;int weight;}AdjMatrix[MAX][MAX];用arc表示邻接矩阵,vexnum和arcnum表示图当前的城市数和公路数。typedefstruct{AdjMatrix arc;intvexnum, arcnum;}MGraph; 时间复杂度0(n^2)算法描述该算法是建立一个带权的无向图,并用Kruskal算法求该图的最小生成树,用父结点和子女结点集的形式输出最小生成树。 1.无向带权图的建立图的存储结构如上所示,;用adj是否为1判断两城市间是否有公路,adj为1时表示有公路,反之没有公路,vexnum和arcnum分别表示城市数和公路数,name和num分别表示城市信息和城市序号,建图的算法如下所示:voidCreatGraph(MGraph *G){int i, j,n,h,m,k;char u[MAX],v[MAX];printf(请输入公路数和城市数:);scanf(%d %d,G-arcnum,G-vexnum) for (i = 1; i = G-vexnum; i++)//初始化图 {for ( j = 1; j = G-vexnum; j++) { G-arc[i][j].adj = G-arc[j][i].adj = 0; } }printf(\n请输入城市的信息:);for(n=1;n=G-vexnum;n++) { scanf(%s,vex[n].name);vex[n].num=n; }for ( i = 1; i = G-arcnum; i++) {printf(\n请输入有公路的2个城市:);scanf(%s,v);scanf(%s,u);for ( k= 1; k = G-vexnum; k++) {if(strcmp(v,vex[k].name)==0) {m=vex[k].num;}if(strcmp(u,vex[k].name)==0) {h=vex[k].num;} } G-arc[m][h].adj = G-arc[h][m].adj = 1;getchar();printf(\n请输入%s与%s之间的公路造价:,vex[m].name, vex[h].name);scanf(%d,G-arc[m][h].weight); }printf(邻接矩阵为:\n);for ( i = 1; i = G-vexnum; i++) { for ( j = 1; j = G-vexnum; j++) {printf(%d ,G-arc[i][j].adj); }printf(\n); }}2. Kruskal算法克鲁斯卡尔算法:假设连通网N=(V,{E}),则令最小生成树的起始状态为只有n个顶点而无边的非连通图T=
文档评论(0)