【数据结构】 医院选址
问题描述
在某个镇中包含n个村庄,现要从这n个村庄中选择一个村庄建立一所医院,这所医院应建在哪个村庄,才能使离医院最远的村庄到医院最近?(Floyd算法)
一堆废话
很久没有更新博客了,小白刚刚历经考试周的打击,百废待兴,赶紧跑来CSDN和小伙伴们取暖安慰受伤的心灵。近期会陆续写四篇数据结构课设的博客,然后再写两篇编写小游戏的博客,一个是基于Python的飞机大战,另一个是基于C++并在funcode上完成的海底世界游戏。
数据描述
(1)首先定义一个结构体,存放弧的权值信息。
#define Size 20
//定义弧的权值信息
typedef struct Arccell
{int adj; //权值
} Arccell, AdjMatrix[Size][Size]; //图的邻接矩
(2)再定义一个结构体,存放村庄信息。
//定义结点信息
typedef struct VertexInfo
{char name[20]; //结点[村庄]名称int position; //定点编号
} VertexInfo;
(3)再定义一个图结构体,存放图的信息。
#define Size 20
//图的结构体
typedef struct Mgraph
{VertexInfo vexs[Size];//顶点数组AdjMatrix arcs;//邻接矩阵int vernum,arcnum;//分别指定顶点数和边数
} Mgraph;
程序代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define INFINITY 1000000
#define Size 20//定义弧的权值信息
typedef struct Arccell
{int adj; //权值
} Arccell, AdjMatrix[Size][Size]; //图的邻接矩阵
//定义结点信息
typedef struct VertexInfo
{char name[20]; //结点[村庄]名称int position; //定点编号
} VertexInfo;
//图的结构体
typedef struct Mgraph
{VertexInfo vexs[Size];//顶点数组AdjMatrix arcs;//邻接矩阵int vernum,arcnum;//分别指定顶点数和边数
} Mgraph;//对图的初始化
Mgraph InitGraph()
{Mgraph c;printf("请输入该图的顶点个数和弧的个数:\n");printf("顶点个数:");scanf("%d",&c.vernum);printf("弧的个数:");scanf("%d",&c.arcnum);//依次设置顶点编号for(int i=0; i<c.vernum; i++){c.vexs[i].position=i;}printf("请依次输入各个村庄的名称:\n");for(int i=0;i<c.vernum;i++){printf("村庄%d\t",i);scanf("%s",&c.vexs[i].name);}//依次设置各弧的信息for(int i=0; i<c.vernum; i++){//先初始化邻接矩阵,相同点设置为0,其他全部设置为INFINITY(无穷大)for(int j=0; j<c.vernum; j++){if(i==j)c.arcs[i][j].adj=0;c.arcs[i][j].adj=INFINITY;}}//再依次输入需要设置的权值int i,j,k;printf("请输入两端顶点和弧长(输入3个0结束):\n");while(scanf("%d%d%d",&i,&j,&k)){if(i==0&&j==0&k==0)break;c.arcs[i][j].adj=k;}return c;
}//输出邻接矩阵
void PrintMatrix(Mgraph c)
{printf("该图的邻接矩阵如下所示:\n");int count=0; //用于计数for(int i=0; i<c.vernum; i++)for(int j=0; j<c.vernum; j++){if(c.arcs[i][j].adj==INFINITY)printf(" #");elseprintf("%4d",c.arcs[i][j].adj);count++;if(count%c.vernum==0)printf("\n");}
}//求最短路径
void ShortestPath_Floyd(Mgraph G,int dis[][Size])
{//用floyd算法求有向网G中各对定点v和w之间的最短路径及其带权长度dis[v][w]for(int v=0; v<G.vernum; v++)for(int w=0; w<G.vernum; w++){//对各结点之间初始化已知距离dis[v][w]=G.arcs[v][w].adj;}for(int k=0; k<G.vernum; k++)for(int i=0; i<G.vernum; i++)for(int j=0; j<G.vernum; j++){if(dis[i][j]>dis[i][k]+dis[k][j]){//从v经u到w的路径更短dis[i][j]=dis[i][k]+dis[k][j];}}}
//输出距离矩阵
void PrintDis(Mgraph G,int dis[Size][Size])
{printf("\n经过Flyod算法之后各顶点之间的距离如下:\n");for(int i=0; i<G.vernum; i++){for(int j=0; j<G.vernum; j++){if(dis[i][j]>=1000000)printf(" #");elseprintf("%4d",dis[i][j]);}printf("\n");}
}//求每个点最大路径
void GetDegree(Mgraph G,int dis[Size][Size],int degree[])
{for(int i=0;i<G.vernum;i++){int max=dis[0][i];for(int j=0;j<G.vernum;j++){if(dis[j][i]>max)max=dis[j][i];}degree[i]=max;}
}int main()
{printf("**********欢迎使用医院选址系统*********\n");Mgraph c=InitGraph();system("cls"); //输出邻接矩阵PrintMatrix(c);//定义距离数组,调用Floyd算法得到结果int dis[Size][Size];ShortestPath_Floyd(c,dis);//输出各个顶点之间的距离矩阵PrintDis(c,dis);int degree[c.vernum];GetDegree(c,dis,degree);//得到最小村庄的编号和名称int num;int min=degree[0];for(int i=0;i<c.vernum;i++){if(min>degree[i])min=degree[i];}for(int i=0;i<c.vernum;i++){if(min==degree[i]){num=i;break;}}printf("医院应该建立在村庄: %4s \n",c.vexs[num].name);return 0;
}
测试数据
(1)开始界面
(2)输入图的信息
(3)输出图的邻接矩阵
(4)输出图各顶点的距离矩阵
(5)输出建立医院的村庄名称
【数据结构】 医院选址相关推荐
- 数据结构案例经验分享--医院选址问题(C语言实现)
数据结构实验案例分享--医院选址问题 问题描述 问题罗列 VexName初始化出现问题 AM_Graph参数传递不成功的问题 最终代码与运行结果展示 问题描述 医院选址问题: n个村庄之间的交通图可以 ...
- Floyd算法应用-医院选址问题
1)问题描述 n个村庄之间的交通图可以用有向网图来表示,图中边<vi, vj>上的权值表示从村庄i到村庄j的道路长度.现在要从这n个村庄中选择一个村庄新建一所医院,问这所医院应建在哪个村庄 ...
- 医院选址问题--数据结构课程设计
2019年12月份的课程设计. 问题描述: n个村庄之间的路径用有向加权图表示,要从这n个村庄中选择一个村庄建立一所医院,问这所医院应建在哪个村庄,能使所有的村庄都离这家医院最近(能使离医院最远的村庄 ...
- C语言大作业 数据结构 医院候诊排队系统 代码【可运行代码+截图】
设计内容: 设计一个医院候诊排队系统.问题描述:医院各科室的医生有限,因此病人到医院看病时必须排队候诊,而病人的病情有轻重之分,不能简单的根据先来先服务的原则进行诊断治疗,所以医院根据病人的病情规定了 ...
- 医院选址问题 C++ 弗洛伊德
描述:n个村庄之间的交通图可以用有向网图来表示,边上的权值表示两村庄之间的道路长度,现在要从这n个村庄中选择一个村庄,建立一个医院,问应建在哪个村庄,使得所有的村庄离医院都比较近. 思路:这里没有明确 ...
- 数据结构超市选址、最短路径查询、地址信息查询
设计河北师范大学的校园平面图,至少包括15个以上的地点,每两个地点间可以有不同的路,且路长可能不同.以图中顶点表示校内各地点,存放名称.代号.简介等信息:用边表示路径,存放路径长度等相关信息. 2.提 ...
- 医院选址c语言课程设计,通信学院2012届本科毕业设计选题结果(学生)2.xls
stu_info 鲜松Nakagami-m衰落下典型正交调幅解调抗噪声干扰分析 张硕琳QDPSK调制解调的数字信号处理实现 张玉玉TD-LTE上行物理层技术性能研究 罗少群基于单片机的频率计的设计 胡 ...
- 【阿朱出品 必属精品】你也说医院,我也说医院
怎么说俺也是在卫生部官办国企做了4年啊,那就说道说道.由于中国医疗制度牵扯全民利益所以变革非常谨慎微小,中国医生圈子大多属于几个院系派系嫡系自我近支繁衍,体制内有事业单位编制问题,体制外有莆田系金钱交 ...
- 现代化医院设计如何满足以人为本和不同人群不同层次的要求
近年来,人们对医疗卫生行业的需求越来越多样化,对医疗水平的要求也越来越高,为能适应社会的发展,更好地保障人民群众的身心健康,现代医院建筑设计时,应在确保医疗功能的基础下,更注重人文关怀,力求创造一个安 ...
最新文章
- 看看人家那后端API接口写得,那叫一个优雅!
- 深度学习 英文 训练阶段_半监督深度学习训练和实现小Tricks
- select初始化默认选项
- 功能测试工作的一点总结
- QT技术应用_2D绘图(转)
- 网易智慧企业2020年度见面会4大亮点抢先看!
- 网站的domain不在首页的原因
- hdu 2222 ac自动机
- SQL Server 2008 评估期已过解决方法
- 为什么VS提示SurfFeatureDetector不是cv的成员函数
- tensorflow随笔——LeNet网络
- Objective-c:NSString的常用方法
- 关于项目部署到外网后,访问域名失败的原因之一
- 世界杯广告中出现汉字,不利于国际化
- 前端js实现批量下载文件
- 工程实践 | 在 Flutter 中实现一个精准的滑动埋点
- 基于ZigBee的家居控制系统的设计与应用
- 用OpenCV计算图像的亚像素值
- 岭南学院python课程作业2-1
- CRC32算法逆向 lebel:基本过程 / 数据表过程(模二过程) / CRC校验 / str转int