1、C+医院选址问题课程设计报告C+医院选址问题-课程设计报告学 号 11710115 数据结构课程设计 设计说明书 医院选址问题 起止日期: 2013年 12月 23 日 至 2013 年 12月27日 学生姓名 路江飞 班级 11卓越七班 成绩 指导教师(签字) 计算机与信息工程学院 2013年12 月 27 日 天津城建大学 课程设计任务书 20132014学年第1学期 计算机与信息工程 学院 11卓越 专业 11卓越 7 班级 课程设计名称: 数据结构课程设计 设计题目: 医院选址问题 完成期限:自 2013 年 12 月 23日至 2013年 12 月 27 日共 1 周 设计依据、要求
2、及主要内容(可另加附页): 一、设计目的 熟悉各种数据结构和运算,会使用数据结构的基本操作解决一些实际问题。 二、设计要求 在本课程设计过程中要求学生: (1)重视课程设计环节,用严谨、科学和踏实的工作态度对待课程设计的每一项任务; (2)按照课程设计的题目要求,独立地完成各项任务,严禁抄袭;凡发现抄袭,抄袭者与被抄袭者皆以零分计入本课程设计成绩。凡发现实验报告或源程序雷同,涉及的全部人员皆以零分计入本课程设计成绩。 (3)学生在接受设计任务后,首先要按设计任务书的要求编写设计进程表。 (4)认真编写课程设计报告。 三、设计内容 1)问题描述 n个村庄之间的交通图可以用有向网图来表示,图中边上
3、的权值表示从村庄i到村庄j的道路长ij度。现在要从这n个村庄中选择一个村庄新建一所医院,问这所医院应建在哪个村庄,才能使所有的村庄离医院都比较近, 2) 基本要求 (1) 建立模型,设计存储结构; (2) 设计算法完成问题求解; (3) 分析算法的时间复杂度。 3) 设计思想 医院选址问题实际是求有向图中心点的问题。首先定义顶点的偏心度。 设图G=(V,E),对任一顶点k,称E(k)=maxd(i, k)(i?V)为顶点k的偏心度。显然,偏心度最小的顶点即为图G的中心点。 如图7(a)所示是一个带权有向图,其各顶点的偏心度如图(b)所示。 顶点 偏心度 c 2 4 a , 1 2 3 e a
4、b b 6 c 8 5 1 d d 5 e 7 (a) (b) 图7 带权有向图及各顶点的偏心度 医院选址问题的算法用伪代码描述如下: 1(对加权有向图,调用Floyd算法,求每对顶点间最短路径长度的矩阵; 2(对最短路径长度矩阵的每列求大值,即得到各顶点的偏心度; 3(具有最小偏心度的顶点即为所求。 四、参考文献 1、王红梅,数据结构,清华大学出版社 2、王红梅,数据结构学习辅导与实验指导,清华大学出版社 3、严蔚敏、吴伟民,数据结构C语言版,清华大学出版社(配题集) 1、设计目的 . 1 2、总体设计 . 1 3、详细设计 . 1 3.1、程序具体功能: . 1 3.2、调试分析: . 4
5、 4、源程序和运行结果 . 4 4.1、源程序 . 4 4.2、运行结果 . 9 5、心得体会 . 9 6、参考文献 . 10 医院选址问题 1、设计目的 熟悉各种数据结构和运算,会使用数据结构的基本操作解决一些实际问题。 2、总体设计 医院选址问题 输入 求最短路径 求最小偏心度 输出 3、详细设计 3.1、程序具体功能: 1(输入函数 从键盘输入村庄的个数、道路的个数、以及各个村庄之间的距离,采用邻接矩阵存储,带有相应的异常处理。 核心代码: void input() bool flag=true; while(flag) 1 coutcountry_number)/异常检测 break;
6、 else cout输入有误endl; cin.sync(); /清空流 cin.clear(); /清除流错误标记 continue; while(flag) coutroad_number&road_number0&road_number= country_number*(coun try_number-1) break; else cout输入有误endl; cin.sync(); /清空流 cin.clear(); /清除流错误标记 continue; for(int i=1;i=country_number;i+) cout请输入第icountry_namei; 2.求最短路径 对加
7、权有向图,调用Floyd算法,求每对顶点间最短路径长度的矩阵。 核心代码: void MGraph:Floyd()/Floyd算法 int i,j,k; for (i=1; i=vertexNum; i+) for (j=1; j=vertexNum; j+) 2 distij=arcij; for (k=1; k=vertexNum; k+) for (i=1; i=vertexNum; i+) for (j=1; j=vertexNum; j+) if (distik+distkjdistij) distij=distik+distkj; 3.求最小偏心度 对最短路径长度矩阵的每列求大值,
8、即得到各顶点的偏心度。 核心代码: int MGraph:min()/求最小偏心度 int resultMaxSize; for(int k=1;k=vertexNum;k+)/初始化求每列的最大值的矩阵 resultk=0; int min_result=9999;/最小偏心度 int temp;/记录医院在几号村庄 for(int i=1;i=vertexNum;i+)/最短路径长度矩阵的每列求大值 int t=0; for(int j=1;jt) t=distji; resulti=t; 4.输出 输出有向图的原始邻接矩阵、最后的邻接矩阵、各个村庄距离医院的距离以及最小偏心度。 核心代码
9、: cout初始的邻接矩阵为:endl; for (i=1; i=vertexNum; i+) for (j=1; j=vertexNum; j+) coutsetiosflags(ios:left); coutsetw(6)arcij; if(j=vertexNum) coutendl; 3 cout最终的邻接矩阵为:endl; for (i=1; i=vertexNum; i+) for (j=1; j=vertexNum; j+) coutsetiosflags(ios:left); coutsetw(6)distij; if(j=vertexNum) coutendl; cout各村庄
10、的偏心度如下所示:endl; for(int b=1;b=vertexNum;b+)/输出各顶点的偏心度 coutresultb ; cout医院应该建在country_nameMG.min()村庄endl; 3.2、调试分析: 1.输入调试 输入相应的数据,查看能不能输出相应的邻接矩阵,从键盘输入任意的数据,查询程序能否正常运行。 2.最小路径调试 运行程序,查看能否将正确结果输出,测试三次以上。 3.最小偏心度调试 运行程序,查看能否将正确结果输出,测试三次以上。 4.输出调试 如果以上三步都调试成功,输出则调试成功。 4、源程序和运行结果 4.1、源程序 MGraph.h: const
11、int MaxSize = 10; /图中最多顶点个数 template class MGraph public: MGraph(DataType a , int n, int e); /构造函数建立具有n个顶点e条边的图 MGraph( ) /析构函数为空 void Floyd(); /Floyd算法 4 int min(); /求最小偏心度 private: DataType vertexMaxSize; /放图中顶点的数组 int arcMaxSizeMaxSize; /存放图中边的数组 int distMaxSizeMaxSize; /存放中间结果的数组 int vertexNum;
12、/图的顶点数 int arcNum; /图的边数 ; MGraph.cpp: #include #include #include #include MGraph.h using namespace std; template /图的存储结构:带权的邻接矩阵存储结构 MGraph:MGraph(DataType a , int n, int e)/构造函数 int i,j,w; vertexNum=n; arcNum=e; for (i=1; i=vertexNum; i+)/数组下标均从1开始 vertexi=ai; for (i=1; i=vertexNum; i+) for (j=1;
13、j=vertexNum; j+) if(i=j) arcij=0; else arcij=9999; /9999表示无穷大 for (int k=1; k=arcNum; k+) couti; cinj; cinw; arcij=w; cout初始的邻接矩阵为:endl; for (i=1; i=vertexNum; i+) for (j=1; j=vertexNum; j+) 5 coutsetiosflags(ios:left); coutsetw(6)arcij; if(j=vertexNum) coutendl; template void MGraph:Floyd()/Floyd算法
14、 int i,j,k; for (i=1; i=vertexNum; i+) for (j=1; j=vertexNum; j+) distij=arcij; for (k=1; k=vertexNum; k+) for (i=1; i=vertexNum; i+) for (j=1; j=vertexNum; j+) if (distik+distkjdistij) distij=distik+distkj; cout最终的邻接矩阵为:endl; for (i=1; i=vertexNum; i+) for (j=1; j=vertexNum; j+) coutsetiosflags(ios
15、:left); coutsetw(6)distij; if(j=vertexNum) coutendl; template int MGraph:min()/求最小偏心度 int resultMaxSize; for(int k=1;k=vertexNum;k+)/初始化求每列的最大值的矩阵 resultk=0; 6 int min_result=9999;/最小偏心度 int temp;/记录医院在几号村庄 for(int i=1;i=vertexNum;i+)/最短路径长度矩阵的每列求大值 int t=0; for(int j=1;jt) t=distji; resulti=t; cout
16、各村庄的偏心度如下所示:endl; for(int b=1;b=vertexNum;b+)/输出各顶点的偏心度 coutresultb ; coutendl; for(int a=1;a=vertexNum;a+)/最小偏心度 if(resultamin_result) min_result=resulta; temp=a; for(int c=1;c=vertexNum;c+) if(temp=c) continue; else coutc号村庄距离temp号村庄:distctempendl; return temp; Main.cpp: #include #include #include
17、 MGraph.cpp using namespace std; string country_nameMaxSize;/村庄名字数组 int country_number; /村庄个数 int road_number; /道路个数 void input() 7 bool flag=true; while(flag) coutcountry_number)/异常检测 break; else cout输入有误endl; cin.sync(); /清空流 cin.clear(); /清除流错误标记 continue; while(flag) coutroad_number&road_number0
18、&road_number=country_number*(country_number-1) break; else cout输入有误endl; cin.sync(); /清空流 cin.clear(); /清除流错误标记 continue; for(int i=1;i=country_number;i+) cout请输入第icountry_namei; void main( ) input(); MGraph MG(country_name, country_number,road_number); MG.Floyd(); cout医院应该建在country_nameMG.min()村庄en
19、dl; 8 4.2、运行结果 5、心得体会 编程是一件很枯燥的事情,但也是一件很有意义的事情,经过一个星期的设计学习,使我对C+语言和数据结构有了更进一步的认识和了解,要想学好它要重在实践,要通过不断的上机操作才能更好地学习它,通过实践,我也发现我的好多不足之处,首先是自己在指法上还不行,经常按错字母,通过学习也有所改进;再有对C+语言的一些标准库函数不太了解,还有对函数调用的正确使用不够熟悉,还有对C+语言中经常出现的错误也不了解,通过实践,使我在这几个方面的认识有所提高。 通过这次的课程设计,我感觉自己写代码的水平还有待提高,要想精通一门编程语言,写大量的代码9 是必不可少的。以后我将更加努力学习专业知识,努力提高写代码的能力。 6、参考文献 1、王红梅,数据结构,清华大学出版社 2、王红梅,数据结构学习辅导与实验指导,清华大学出版社 3、严蔚敏、吴伟民,数据结构C语言版,清华大学出版社(配题集) 4、王晓东,计算机算法分析与设计(第三版) 10
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1