ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2022-02-28 23:35:19  阅读:203  来源: 互联网

标签:NUM arcs ++ VERTEX C语言 int 算法 Floyd 顶点


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

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

各顶点最短距离:

ABCDEF总和
A\23510323
B2\2410523
C32\28621
D542\10829
E1010810\745
F35687\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; i < G->vexnum; i++)
		G->vertex[i] = 'A' + i;
	for (i = 0; i < G->vexnum; i++) {		//初始化邻接矩阵
		for (j = 0; j < G->vexnum; j++)
			G->arcs[i][j] = INFINITY;
	}

	G->arcs[0][1] = 2;						//建立邻接矩阵
	G->arcs[0][2] = 3;
	G->arcs[0][4] = 10;
	G->arcs[0][5] = 3;
	G->arcs[1][2] = 2;
	G->arcs[2][3] = 2;
	G->arcs[2][4] = 8;
	G->arcs[4][5] = 7;

	G->arcs[1][0] = 2;
	G->arcs[2][0] = 3;
	G->arcs[4][0] = 10;
	G->arcs[5][0] = 3;
	G->arcs[2][1] = 2;
	G->arcs[3][2] = 2;
	G->arcs[4][2] = 8;
	G->arcs[5][4] = 7;
}

/*求图的中心顶点算法*/
void CenterVex(AdjMatrix G) {
	int i, j, k, min, len;
	int A[VERTEX_NUM][VERTEX_NUM];			//A[i][j]存放顶点i和j之间的最短路径长度
	for (i = 0; i < VERTEX_NUM; i++) {		//初始化A[i][j]
		for (j = 0; j < VERTEX_NUM; j++)
			A[i][j] = G.arcs[i][j];
		A[i][i] = 0;						//i到i的路径长度为0
	}
	for (k = 0; k < VERTEX_NUM; k++) {		//求出每一对顶点之间的最短路径长度(Floyd算法核心)
		for (i = 0; i < VERTEX_NUM; i++) {
			for (j = 0; j < VERTEX_NUM; j++) {
				if (A[i][k] + A[k][j] < A[i][j])
					A[i][j] = A[i][k] + A[k][j];
			}
		}
	}
	min = INFINITY;
	k = 0;
	for (i = 0; i < VERTEX_NUM; i++) {		//选择到各顶点最短路径长度之和最小的顶点vk
		len = 0;
		for (j = 0; j < VERTEX_NUM; j++)	//求vi到其余各顶点的最短路径长度之和
			len = len + A[i][j];
		if (len < min) {
			k = i;
			min = len;
		}
	}
	printf("建在%c处\n最短运输总距离为%d\n", G.vertex[k], min);
}

int main() {
	AdjMatrix G;
	CreateDN(&G);
	CenterVex(G);
	return 0;
}

运行结果:
运行结果

标签:NUM,arcs,++,VERTEX,C语言,int,算法,Floyd,顶点
来源: https://blog.csdn.net/weixin_51450101/article/details/123119924

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有