1)问题描述
n个村庄之间的交通图可以用有向网图来表示,图中边<vi, vj>上的权值表示从村庄i到村庄j的道路长度。现在要从这n个村庄中选择一个村庄新建一所医院,问这所医院应建在哪个村庄,才能使所有的村庄离医院都比较近?
2) 基本要求
(1) 建立模型,设计存储结构;
(2) 设计算法完成问题求解;
(3) 分析算法的时间复杂度。
3) 设计思想
医院选址问题实际是求有向图中心点的问题。首先定义顶点的偏心度。
设图G=(V,E),对任一顶点k,称E(k)=max{d(i, k)}(i∈V)为顶点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 }