【算法】(Floyd算法)图的中心顶点问题(C语言)

题目: 某公司在某地区共有六个产品销售点,销售点间的距离如下图所示。现根据业务需要计划在其中某个销售点上建立一个中心仓库,负责向其它销售点提供产品。
假设每天需要向每个销售点运输一次产品且每次运输只能供应一个销售点,那么将中心仓库建在何处才能保证运输总距离最短?求出最短运输距离。
图

思路:
这是一个求图的中心顶点问题,即在一个带权图G中,求出一个顶点v,使得v到其余顶点的最短路径长度之和最小。首先用弗罗伊德算法求出图中各个顶点之间的最短路径长度,然后再求出每个顶点到其余各顶点的最短路径长度之和,从中选取一个最短路径长度之和最小的顶点即为要求的顶点。

各顶点最短距离:

A B C D E F 总和
A \ 2 3 5 10 3 23
B 2 \ 2 4 10 5 23
C 3 2 \ 2 8 6 21
D 5 4 2 \ 10 8 29
E 10 10 8 10 \ 7 45
F 3 5 6 8 7 \ 29

上图的邻接矩阵表示("∞"表示不连通)
邻接矩阵

实现代码+注释

# include<stdio.h>
# define VERTEX_NUM 6				//顶点个数
# define INFINITY 32768

/*图的邻接矩阵表示法*/
typedef struct {
   
	char vertex[VERTEX_NUM];				//顶点
	int arcs[VERTEX_NUM][VERTEX_NUM];		//邻接矩阵
	int vexnum, arcnum;						//图的顶点数和弧数
}AdjMatrix;

/*根据题中信息创建无向网*/
int CreateDN(AdjMatrix* G) {
   
	int i, j;
	G->vexnum = 6;							//共有6个销售点即图顶点数为6
	G->arcnum = 8;							//共有8条路径即图的弧数为8
	for (i = 0
  • 14
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值