问题描述

在某个镇中包含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)输出建立医院的村庄名称

【数据结构】 医院选址相关推荐

  1. 数据结构案例经验分享--医院选址问题(C语言实现)

    数据结构实验案例分享--医院选址问题 问题描述 问题罗列 VexName初始化出现问题 AM_Graph参数传递不成功的问题 最终代码与运行结果展示 问题描述 医院选址问题: n个村庄之间的交通图可以 ...

  2. Floyd算法应用-医院选址问题

    1)问题描述 n个村庄之间的交通图可以用有向网图来表示,图中边<vi, vj>上的权值表示从村庄i到村庄j的道路长度.现在要从这n个村庄中选择一个村庄新建一所医院,问这所医院应建在哪个村庄 ...

  3. 医院选址问题--数据结构课程设计

    2019年12月份的课程设计. 问题描述: n个村庄之间的路径用有向加权图表示,要从这n个村庄中选择一个村庄建立一所医院,问这所医院应建在哪个村庄,能使所有的村庄都离这家医院最近(能使离医院最远的村庄 ...

  4. C语言大作业 数据结构 医院候诊排队系统 代码【可运行代码+截图】

    设计内容: 设计一个医院候诊排队系统.问题描述:医院各科室的医生有限,因此病人到医院看病时必须排队候诊,而病人的病情有轻重之分,不能简单的根据先来先服务的原则进行诊断治疗,所以医院根据病人的病情规定了 ...

  5. 医院选址问题 C++ 弗洛伊德

    描述:n个村庄之间的交通图可以用有向网图来表示,边上的权值表示两村庄之间的道路长度,现在要从这n个村庄中选择一个村庄,建立一个医院,问应建在哪个村庄,使得所有的村庄离医院都比较近. 思路:这里没有明确 ...

  6. 数据结构超市选址、最短路径查询、地址信息查询

    设计河北师范大学的校园平面图,至少包括15个以上的地点,每两个地点间可以有不同的路,且路长可能不同.以图中顶点表示校内各地点,存放名称.代号.简介等信息:用边表示路径,存放路径长度等相关信息. 2.提 ...

  7. 医院选址c语言课程设计,通信学院2012届本科毕业设计选题结果(学生)2.xls

    stu_info 鲜松Nakagami-m衰落下典型正交调幅解调抗噪声干扰分析 张硕琳QDPSK调制解调的数字信号处理实现 张玉玉TD-LTE上行物理层技术性能研究 罗少群基于单片机的频率计的设计 胡 ...

  8. 【阿朱出品 必属精品】你也说医院,我也说医院

    怎么说俺也是在卫生部官办国企做了4年啊,那就说道说道.由于中国医疗制度牵扯全民利益所以变革非常谨慎微小,中国医生圈子大多属于几个院系派系嫡系自我近支繁衍,体制内有事业单位编制问题,体制外有莆田系金钱交 ...

  9. 现代化医院设计如何满足以人为本和不同人群不同层次的要求

    近年来,人们对医疗卫生行业的需求越来越多样化,对医疗水平的要求也越来越高,为能适应社会的发展,更好地保障人民群众的身心健康,现代医院建筑设计时,应在确保医疗功能的基础下,更注重人文关怀,力求创造一个安 ...

最新文章

  1. 看看人家那后端API接口写得,那叫一个优雅!
  2. 深度学习 英文 训练阶段_半监督深度学习训练和实现小Tricks
  3. select初始化默认选项
  4. 功能测试工作的一点总结
  5. QT技术应用_2D绘图(转)
  6. 网易智慧企业2020年度见面会4大亮点抢先看!
  7. 网站的domain不在首页的原因
  8. hdu 2222 ac自动机
  9. SQL Server 2008 评估期已过解决方法
  10. 为什么VS提示SurfFeatureDetector不是cv的成员函数
  11. tensorflow随笔——LeNet网络
  12. Objective-c:NSString的常用方法
  13. 关于项目部署到外网后,访问域名失败的原因之一
  14. 世界杯广告中出现汉字,不利于国际化
  15. 前端js实现批量下载文件
  16. 工程实践 | 在 Flutter 中实现一个精准的滑动埋点
  17. 基于ZigBee的家居控制系统的设计与应用
  18. 用OpenCV计算图像的亚像素值
  19. 岭南学院python课程作业2-1
  20. CRC32算法逆向 lebel:基本过程 / 数据表过程(模二过程) / CRC校验 / str转int

热门文章

  1. 大规模集群全网数据备份解决方案
  2. 某校2019专硕编程题-简易计算器
  3. VVC学习之五:VTM帧内预测工具详解
  4. C语言怎么实现多个值输出?
  5. 英特尔至强E3、E5、E7处理器有什么区别呢?
  6. python 遍历函数用法_python中enumerate函数遍历元素用法分析
  7. mysql中表联结_MySQL -- 表联结
  8. 用python将中文转拼音
  9. 使用Ajax自动获取QQ头像昵称
  10. hdoj 2036 改革春风吹满地 (多边形面积)