算法之最短路径问题

最短路径之医院选址问题

某大队有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;
}
  • 4
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值