版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、计算机科学与技术系课程设计报告2011 2012 学年第二学期课程 数据结构与算法课程设计名称公路设计问题学生姓名 学号1004013008专业班级计算机科学与技术10级4班指导教师 2012 年 2 月题目:公路建设问题a国是一个新兴的国家,有n个城市,分别编号为1,2.3n。政府想大搞公路建设,提供了优惠政策:对于每一个投资方案的预计总费用,政府负担50%,并且允许投资的公司对过往的汽车收取连续5年的养路费。世界各地的大公司纷纷投资,并提出了自己的建设方案,他们的投资方案包括这些内容:公路连接的两座城市的编号,预计的总费用(假设他们的预计总是准确的)。你作为a国公路规划局的总工程师,有权利
2、决定每一个方案是否接受。但是政府给你的要求是:(1)要保证各个城市之间都有公路直接或间接相连。 (2)因为是新兴国家,政府的经济实力还不强。政府希望负担最少的费用。 (3)因为大公司并不是同时提出方案,政府希望每接到一个方案,就可以知道当前需要负担的最小费用和接受的投资方案,以便随时开工。 (4)关于你给投资公司的回复可以等到开工以后再给。注意:a国一开始是没有公路的。设计要求:(1)输入第1行有两个数字:n、m ,a国的城市数目n<=500,投资的方案总数m<=2000。第2行到第m+1行给出了各个投资方案,第i行的方案编号为i-1;编号小的方案先接到,一个方案占一行,每行有3个
3、数字,分别是连接的两个城市编号a、b,和投资的预计总费用cost。(2)输出文件共有m行。每一行的第一个数字是当前政府需要负担的最少费用(保留1位小数),后面是x个数字,表示当前政府接受的方案的编号,不要求从小到大排列。但如果此时接受的所有投资方案不能保证政府的第一条要求,那么这一行只有一个数字0。(3)应用“数据结构与算法”课程知识建立该问题的数据结构模型;(4)分析算法的时间性能。1、问题分析和任务定义这道题看起来很复杂,其实就是要求你对一个最小生成树进行动态维护。 通过对问题的认真分析,初步得到结论:(1)问题中涉及的具体事物可以抽象为数据结构中图的存储。(2)图可以用邻接矩阵来储存,邻
4、接矩阵记录城市数目(顶点数)、投资方案数(边数)、投资方案费用(权值)以及投资方案的编号(次权值),且存储的数据类型均为整型,其中投资方案费用、投资方案的编号要用较复杂的结构体定义。(3)将图的数据信息存储的邻接矩阵时,要注意录入方案的俩个城市可能会一样;这时就必须对录入的权值进行选择,让较小的权值录入。(4)该问题的核心在于如何求出所有城市间的最短路径;由于方案的逐一录入的,所有需要判断已录入的方案是否可以生成最小生成树;若生成则输出费用等信息,否则输出0。问题要求的输入输出的格式较为苛刻;故需认真考虑所给的信息,该输入什么,不该输入什么;该输出什么,不该输出什么。如当不满足生成最小生成树的
5、时候,输出“只有一个数字0”。上述具体的解决方案见详细设计。2、 数据结构的选择和概要设计程序分为两大部分 1 存储部分, 2 算法部分;存储部分分为邻接矩阵;算法部分分为普里母算法。时间复杂度:邻接矩阵创建:每次读入一条边 e(a,b),要检查a, b之间是否有路径相连,我们需要一个深搜的过程 ,如果我们用链表的话,深搜的时间复杂为 o(e),而最小树形图中最多只有 n-1 条边,所以这个过程为 o(n)级的 ,然后我们要去边与加边,这都是小于o(n)级的, ,所以维护的时间复杂的是o(n)级的。 因为有m要增加,我们总共要维护 m次, 所以总的时间复杂度为o(n*m)级的,这是可以承受的。
6、普里姆算法的建立为o(n*n)级的。邻接矩阵的算法思想:用一个一维数组存放图中所有顶点数据;用一个二维数组存放顶点间关系(边或弧)的数据,这个二维数组称为邻接矩阵。邻接矩阵又分为有向图邻接矩阵和无向图邻接矩阵。补充:closedgev的类型: 用来存储从u到v-u之间具有最小代价的边。其中一个是权值域lowcost存储最小代价的边上的权值,另一个是顶点域adjves,存储依附于该边在u中的顶点。 动态维护最小生成树的处理方法: 读入一条a到b的边之后,先不将这一条边加入图中,检查 a到 b之间是否有路径相连,若相连则找到路径上权值最大的一条边 e(u,v);若e(u,v)的权值比新读入的这条边
7、的权值要小或相等,则去掉新读入的边;若e(u,v)的权值比新读入的这条边的权值要大,则去掉 e(u,v),加入新读入的边;若不相连则直接将新读入的边。这样,每次读入一条边后,仍能使图保持为最小树形图。本程序包含5个函数:主函数int main();顶点对焦函数int locatevex();创建邻接矩阵函数int createan();求最小权值函数int minimum();普利姆函数void minispantree_prim();各函数间关系如图1所示: int main int createan() void minispantree_prim() int locatevex() in
8、t minimum()图1 :各函数之间关系 3、详细设计和编码(1)结点类型邻接矩阵的数据结构typedef struct int adj;/ 顶点关系类型 int info;/该弧相关信息arccell, adjmatrixmax_vertex_nummax_vertex_num; 使边不仅记录了权值还记录了边相关信息(如编号)图的数据结构typedef struct int vexsmax_vertex_num;/ 顶点向量 adjmatrix arcs;/ 邻接矩阵 int vexnum,/ 图的当前顶点数 arcnum;/ 图的当前弧数 mgraph;记录从顶点集u到v-u的代价最小
9、的边的辅助数组定义typedef structint adjvex; int lowcost;minsidemax_vertex_num;(2)诠释各函数的功能:主函数int main()mgraph g;createan(&g);system("pause");return 0; 创建邻接矩阵数据结构变量g;调用函数createan(&g)。创建邻接矩阵函数int createan()int createan(mgraph *g)int i,j,k,w; . .if(*g).arcsij.adj=infinity)/判断原是否存在边(*g).arcsij.
10、adj=(*g).arcsji.adj=w; / 无向 else if(*g).arcsij.adj>w) (*g).arcsij.adj=(*g).arcsji.adj=w; .minispantree_prim(*g),(*g).vexs0); 这是该函数的核心部分,其功能是录入图的邻接矩阵,且做到了当输入的俩顶点相同时,后输入的边的权值若比前输入的小,则后者代替前者将权值录入,反之则不做处理。求最小权值函数int minimum();int minimum(minside sz,mgraph g)int i=0,j,k,min;. .min=szj.lowcost;k=j;retu
11、rn k;帮助最小生成树求出closedgek.lowcost中最小一个;返回值为k。普利姆函数void minispantree_prim()void minispantree_prim(mgraph g,int u)int i,j,k,l,r; . .if(closedgek.lowcost=infinity) printf("0n");return ; . .bi=g.;sum=sum+closedgek.lowcost;/ 新顶点并入u集后重新选择最小边 closedgej.adjvex=g.vexsk;closedgej.lowcost=g.
12、arcskj.adj;本函数是该代码的重中之重;主要运用到了普利姆算法,其功能是将运行的这所生成的邻接矩阵转化为其最小生成树的权值和输出;同时解决了题目中当不可以最小生成树数时仅输出“0”的要求,方法为若所经过求最小权值函数int minimum()后得到的权值中有等于无穷大时;则输出“0”,同时退出函数;算法思想:当非构成最小生成树则必有closedgek.lowcost为无穷大,反之则没有。顶点对焦函数int locatevex();int locatevex(mgraph g,int u)判断输入的顶点是否有实际的该点;4、 上机调试过程 图2:调试1图3:调试2图4:调试3图2、3、4
13、以举例出所有的数据输入情况,解释了本程序的完整性。5、 测试结果及其分析在程序的编写过程中,我受挫无数。其中值得一提的就是编写最小生成树代码。输入 输出5 5 1 2 3 02 4 5 05 3 2 01 2 1 03 4 1 0原因有二种:1、建立邻接矩阵出错; 2、最小生成树求最小权值出错。6、用户使用说明程序适用于计算从任意城市出发连通各城市之间所的最小费用或距离。注意:输入的城市数目不得超过500,方案数目不得超过2000。7、参考文献(1) 王昆仑,李红。数据结构与算法。北京:中国铁道出版社,2007。(2) 严蔚敏,吴伟民。数据结构:c语言。北京清华大学出版社。2002。8、 附录
14、源代码:#include"malloc.h" #include"stdlib.h" #include"stdio.h"#include <limits.h>#define max_vertex_num 200/ 最大顶点个数#define infinity int_max/ 用整型最大值代替/ 邻接矩阵的数据结构typedef structint adj; / 顶点关系类型。对无权图,用1(是)或0(否)表示相邻否; / 对带权图,则为权值类型 int info; / 该弧相关信息的指针(可无) arccell, adjm
15、atrixmax_vertex_nummax_vertex_num;/ 图的数据结构typedef structint vexsmax_vertex_num;/ 顶点向量adjmatrix arcs;/ 邻接矩阵int vexnum,/ 图的当前顶点数arcnum;/ 图的当前弧数 mgraph;/ 记录从顶点集u到v-u的代价最小的边的辅助数组定义typedef structint adjvex;int lowcost;minsidemax_vertex_num;int locatevex(mgraph g,int u);int createan(mgraph *g);int minimum
16、(minside sz,mgraph g);void minispantree_prim(mgraph g,int u);/ 若g中存在顶点u,则返回该顶点在图中位置;否则返回-1。int locatevex(mgraph g,int u)int i;for(i = 0; i < g.vexnum; +i)if(u=g.vexsi)return i;return -1;/ 采用数组(邻接矩阵)表示法,构造无向网g。int createan(mgraph *g)int i,j,k,w; int s;int va,vb;printf("请输入城市数目、方案数目:(空格区分) &qu
17、ot;);scanf("%d%d%*c",&(*g).vexnum,&(*g).arcnum); .for(i=0;i<(*g).vexnum;+i) / 构造顶点向量 (*g).vexsi=i+1;for(i=0;i<(*g).vexnum;+i) / 初始化邻接矩阵 for(j=0;j<(*g).vexnum;+j)(*g).arcsij.adj=infinity; / 网初始化为无穷大 (*g).=0;printf("请输入各方案的二个城市和方案费用:(以空格作为间隔): n");for(k=
18、0;k<(*g).arcnum;+k)printf("方案%d:",k+1);scanf("%d%d%d%*c",&va,&vb,&w); / %*c吃掉回车符 i=va-1;j=vb-1;if(*g).arcsij.adj=infinity)/判断原是否存在边(*g).arcsij.adj=(*g).arcsji.adj=w; / 无向 else if(*g).arcsij.adj>w) (*g).arcsij.adj=(*g).arcsji.adj=w; s=k+1;(*g).=(*g).ar
19、=s; / 无向 minispantree_prim(*g),(*g).vexs0);return 1;/ 求closedge.lowcost的最小正值int minimum(minside sz,mgraph g)int i=0,j,k,min;while(!szi.lowcost)i+;min=szi.lowcost; / 第一个不为0的值 k=i;for(j=i+1;j<g.vexnum;j+)if(szj.lowcost>0)if(min>szj.lowcost)min=szj.lowcost;k=j;return k;/ 算法10.5 p330/ 用普里姆算法从第u个顶点出发构造网g的最小生成树t,输出t的各条边void minispantree_prim(mgraph g,int u)int i,j,k,l,r; int b2000;float sum=0;minside closedge;k=locatevex(g,u);for(j=0;j<g.vexnum;+j) / 辅助数组初始化 if(j!=k)closedgej.adjvex=u;closedgej.lo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 慈溪立体仓库租赁协议书
- 商业滑雪场免责协议书
- 航天精神调查报告
- 员工出差报销管理规定
- 弘扬工匠精神 成就出彩人生
- 慢性阻塞性肺疾病患者吸氧疗法指南
- 肺部科肺炎预防指南
- 2026重庆大学输变电装备技术全国重点实验室劳务派遣科研助理招聘2人备考题库带答案详解(精练)
- 2026西安交通大学专职辅导员招聘24人备考题库及答案详解(必刷)
- 2026河南郑州巩义市产业投资发展有限公司招聘副总经理1人备考题库及答案详解【名师系列】
- 2026宝洁(中国)秋招面试题及答案
- 代孕合同协议书
- 古蔺花灯课件
- 周大福珠宝公司员工激励机制分析
- 《中国饮食文化》 课件 第五章 中国酒文化
- 小学语文阅读培训课件
- 2026年中国蛋行业市场前景预测及投资价值评估分析报告
- 垫付工程材料款协议书
- 综合管廊及消防工程介绍
- 上海农商银行2025招聘笔试真题及答案解析
- 飞檐一角课件
评论
0/150
提交评论