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

该博客介绍了一个利用Floyd算法解决医院选址问题的方法。通过计算有向图中每个村庄到其他村庄的最短路径,找出偏心度最小的村庄作为医院位置。文章详细阐述了问题描述、基本要求、设计思想,并提供了算法伪代码,同时附有程序运行的各个阶段截图,展示了解决过程和最终结果。
摘要由CSDN通过智能技术生成

1)问题描述

n个村庄之间的交通图可以用有向网图来表示,图中边<vi, vj>上的权值表示从村庄i到村庄j的道路长度。现在要从这n个村庄中选择一个村庄新建一所医院,问这所医院应建在哪个村庄,才能使所有的村庄离医院都比较近?

2) 基本要求

(1) 建立模型,设计存储结构;

(2) 设计算法完成问题求解;

(3) 分析算法的时间复杂度。

3) 设计思想

医院选址问题实际是求有向图中心点的问题。首先定义顶点的偏心度。

设图G=(VE),对任一顶点k,称E(k)=max{d(i, k)}(iV)为顶点k的偏心度。显然,偏心度最小的顶点即为图G的中心点。

如图3(a)所示是一个带权有向图,其各顶点的偏心度如图(b)所示。

 

4)医院选址问题的算法用伪代码描述如下:

1.对加权有向图,调用Floyd算法,求每对顶点间最短路径长度的矩阵;

2.对最短路径长度矩阵的每列求大值,即得到各顶点的偏心度;

3.具有最小偏心度的顶点即为所求。

5)代码附录

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<string.h>
  4 #define INFINITY 1000000
  5 #define MAX_VERTEX_NUM 20
  6 
  7 //定义弧的权值信息
  8 typedef struct Arccell
  9 {
 10     int adj; //权值
 11 } Arccell, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; //图的邻接矩阵
 12 //定义结点信息
 13 typedef struct VertexInfo
 14 {
 15     char name[20];//结点[村庄]名称
 16     int position;//定点编号
 17 } VertexInfo;
 18 //图的结构
 19 typedef struct Mgraph
 20 {
 21     VertexInfo vexs[MAX_VERTEX_NUM];//顶点数组
 22     AdjMatrix arcs;//邻接矩阵
 23     int vernum,arcnum;//分别指定顶点数和边数
 24 } Mgraph;
 25 
 26 
 27 //对图的初始化
 28 Mgraph initgraph()
 29 {
 30     Mgraph c;
 31     printf("请输入该图的顶点个数和弧的个数:\n");
 32     printf("顶点个数:");
 33     scanf("%d",&c.vernum);
 34     printf("弧的个数:");
 35     scanf("%d",&c.arcnum);
 36     //依次设置顶点编号
 37     for(int i=0; i<c.vernum; i++)
 38     {
 39         c.vexs[i].position=i;
 40     }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值