最短路径之医院选址问题
某大队有5个村庄ABCDE,村庄之间道路情况如图所示:
现在要在其中一个村庄选为医院建造地址,目的是从其他村庄到该村庄来回路径最短。问医院应该建在哪个村庄?
本文通过邻接矩阵的有向图模型解决该问题:
C语言代码:
#include<iostream>
using namespace std;
#define N 5
const int M = 1000; //用一个非常大的数表示无穷大
char vertex[N] = {'A', 'B', 'C', 'D', 'E'}; //设置顶点编号,用一位数组存放
int edge[N][N] = { //存放边的二维数组
{0, 13, M, 4, M},
{13, 0, 15, M, 5},
{M, M, 0, 12, M},
{4, M, 12, 0, M},
{M, M, 6, 3, 0}
};
int dist[N][N] = {0}; //存储任意两个顶点的最短距离
void Floyd() { //Floyd算法求解任意两个点之间的最短路径
int i, j, k;
for(i = 0; i < N; i++) { //初始化矩阵
for(j = 0; j < N; j++) {
dist[i][j] = edge[i][j];
}
}
for(k = 0; k < N; k++) { //进行N次迭代
for(i = 0; i < N; i++) { //顶点i j之间是否经过顶点k
for(j = 0; j < N; j++) {
if(dist[i][k] + dist[k][j] < dist[i][j])
dist[i][j] = dist[i][k] + dist[k][j];
}
}
}
}
int Center() { //求图的中心点,返回中心点下标
int wayCost, minCost = M;
int i, k, index;
for(k = 0; k < N; k++) { //依次求每个顶点的往返代价
wayCost = 0; //首先将往返代价初始化为0
for(i = 0; i < N; i++) //顶点i到其他顶点的路径长度之和
wayCost = wayCost + dist[i][k];
for(i = 0; i < N; i++) //其他顶点到顶点i的路径长度之和
wayCost = wayCost + dist[k][i];
if(wayCost < minCost) {
minCost = wayCost;
index = k; //顶点k为当前中心点
}
}
return index; //返回中心点下标
}
int main() {
Floyd();
int minPoint = Center();
printf("应该设置在 %c 点\n", vertex[minPoint]);
system("pause");
return 0;
}