数据结构课程设计-超市选址问题
数据结构课程设计学校超市选址问题

一、需求分析1)核心问题:求最短路径(选址得要求就就是超市到各单位权值之与最少)2)数据模型(逻辑结构):带权有向图(权值计算:距离*频度)3)存储结构: typedef struct{string vexs[MAX_VERTEX_SIZE];ﻩint arcs[MAX_VERTEX_SIZE][MAX_VERTEX_SIZE];int vexnum;// ,arcnum;}MGraph;核心算法:Floyd算法(弗洛伊德算法—每一对顶点之间得最短路径)输入数据:各单位名称,距离,频度,单位个数.输出数据:所选单位名称。
总体思路:如果超市就是要选在某个单位,那么先用floyd算法得出各顶点间得最短距离/最小权值。
假设顶点个数有n个,那么就得到n*n得一张表格,arcs(i,j)表示i单位到j单位得最短距离/最小权值 , 这张表格中与最小得那一行(假设为第t行),那么超市选在t单位处就就是最优解.2 运行环境Visual Stdio C++6、0ﻩWindows Vista/2003/XP3 概要设计Floyd算法利用动态规划思想,通过把问题分解为子问题来解决任意两点见得最短路径问题。
设G=(V, E,w)就是一个带权有向图,其边V={v1, v2, …,vn}。
对于k≤n,考虑其结点V得一个子集。
对于V中任何两个结点vi、vj,考虑从vi到vj得中间结点都在vk中得所有路径,设该路径就是其中最短得,并设它得路径长度为最短路径长度.如果结点vk不在从vi到vj得最短路径上,则;反之则可以把分为两段,其中一段从vi到vk,另一段从vk到vj,这样便得到表达式.上述讨论可以归纳为如下递归式:原问题转化为对每个i与j求,或者说求矩阵#include 〈stdio、h〉#include <stdlib、h>#include<time、h〉#include "malloc、h"#include <iostream、h>#define TURE 1#define FALSE0#define OK 1#define ERROR 0#defineOVERFLOW -1#define INF 32767const int MAXVEX=100;typedef char V extype;4、2结构体得定义typedef struct{ﻩVextype vexs[MAXVEX][MAXVEX]; //单位名称(顶点信息);int adj[MAXVEX][MAXVEX];ﻩ//单位之间得相通情况(就是否有边);int dis[MAXVEX][MAXVEX];ﻩﻩﻩﻩ//单位间距离(边得长度);ﻩint f[MAXVEX];ﻩﻩﻩﻩﻩﻩ//各单位去超市得频率;int n;ﻩﻩﻩﻩﻩ//顶点数与边数;ﻩint e;}Mgraph;4、3变量得输入voidCreatMgraph(Mgraph *G){int i,j,k;printf(”请输入单位个数:\n");ﻩscanf("%d”,&(G-〉n));printf(”请输入单位间得路径数:\n");scanf(”%d",&(G-〉e));ﻩprintf(”请输入单位名称:\n");for(i=0;i<G->n;i++){ﻩprintf("请输入第%d个单位名称:\n",i);scanf("%s",&G->vexs[i]);}ﻩfor(i=0;i〈G->n;i++)ﻩﻩ //结构体得初始化;ﻩﻩfor(j=0;j〈G-〉n;j++)ﻩﻩ{ﻩﻩG->adj[i][j]=0;ﻩG-〉dis[i][j]=0;ﻩG-〉f[i]=0;ﻩ}for(k=0;k〈G-〉e;k++){ﻩprintf("请输入相通得两单位 (输入格式:i,j):\n”);ﻩﻩscanf("%d,%d",&i,&j);//在距离上体现为无向;ﻩﻩprintf("请输入相同两个单位间得距离(格式:dis):\n");ﻩscanf(”%d",&(G-〉dis[i][j]));ﻩﻩG->adj[i][j]=1;ﻩG-〉adj[j][i]=1;ﻩG->dis[j][i]=G->dis[i][j];ﻩ}ﻩfor(k=0;k<G-〉n;k++)ﻩ{ﻩprintf(”请输入第%d个单位去超市得相对频率:\n”,k);ﻩscanf(”%d”,&(G-〉f[k]));ﻩ}ﻩfor(i=0;i<G—>n;i++)ﻩﻩﻩﻩﻩ //以距离与频率之积作为权值;ﻩfor(j=0;j<G—〉n;j++){G->dis[i][j]*=G-〉f[i];//最终权值非完全无向;if(G—>adj[i][j]==0&&i!=j)ﻩﻩﻩG->dis[i][j]=INF;ﻩﻩ}}4、4带权有向图求最短路径floyd算法void Floyed(Mgraph *G)//带权有向图求最短路径floyd算法{ﻩint A[MAXVEX][MAXVEX],path[MAXVEX][MAXVEX];ﻩint i,j,k,pre;int count[MAXVEX];for(i=0;i〈G->n;i++) //初始化A[][]与path[][]数组for(j=0;j〈G—〉n;j++) //置初值;ﻩﻩ{ﻩﻩA[i][j]=G—>dis[i][j];ﻩﻩﻩpath[i][j]=-1;ﻩﻩﻩcount[i]=0;}ﻩfor(k=0;k<G—>n;k++) //k代表运算步骤{ﻩfor(i=0;i<G->n;i++)for(j=0;j〈G->n;j++)ﻩﻩif(A[i][j]>(A[i][k]+A[k][j])) //从i经j到k得一条路径更短ﻩﻩﻩﻩ{ﻩﻩﻩA[i][j]=A[i][k]+A[k][j];ﻩpath[i][j]=k;ﻩﻩﻩﻩ}ﻩ}cout<〈endl<<"Floyed算法求解如下:"〈<endl;ﻩfor(i=0;i<G—>n;i++)for(j=0;j<G-〉n;j++)ﻩ{ﻩﻩﻩif(i!=j)ﻩ{ﻩﻩcout<〈" "〈<i<〈”—>"〈〈j<<”;";if(A[i][j]==INF)ﻩﻩ{ﻩﻩﻩﻩif(i!=j)ﻩcout〈<"不存在路径”<<”\n"<<endl;ﻩ}ﻩelseﻩﻩﻩ{ﻩﻩﻩcout<〈"路径长度为:"<<A[i][j]〈<"\n";ﻩﻩﻩcout〈<"路径为:"<〈i〈〈”*";ﻩﻩﻩﻩpre=path[i][j];ﻩwhile(pre!=—1)ﻩﻩ{ﻩﻩﻩcout<<pre<<”\n";ﻩﻩﻩﻩpre=path[pre][j];ﻩﻩ}ﻩﻩﻩcout〈〈j〈〈endl;ﻩﻩ}ﻩﻩﻩ}}//以下为选择总体最优过程,然后确址;ﻩfor(i=0;i<G->n;i++)ﻩfor(j=0;j〈G-〉n;j++)ﻩ{ﻩﻩif(A[i][j]==INF)ﻩcount[i]=0;ﻩelseﻩcount[i]=1;}ﻩfor(i=0;i<G-〉n;i++)ﻩif(count[i]){ﻩfor(j=0;j<G-〉n;j++)ﻩif(i!=j)A[i][i]+=A[j][i];}k=0;for(i=0;i〈G—>n;i++)ﻩ{ﻩif(count[i])ﻩﻩif(A[k][k]>A[i][i])ﻩﻩﻩk=i;}ﻩcout<<"超市得最佳地址为:”<<G-〉vexs[k]<<endl;}4、5主函数模块void main(){Mgraph *Gh=NULL;Gh=(Mgraph *)malloc(sizeof(Mgraph));ﻩCreatMgraph(Gh);Floyed(Gh);ﻩsystem("pause");}5 调试分析5、1本题目得关键点之一:有两个权值:各单位到超市得距离及各单位人去超市得频度。
学校超市选址问题(带权有向图的中心点)

最短路径为:3->4; 最短路径长度为 1; 4到0 最短路径为:4->2->0; 最短路径长度为 25; 4到1 最短路径为:4->2->1; 最短路径长度为 35; 4到2 最短路径为:4->2; 最短路径长度为 10; 4到3 最短路径为:4->3; 最短路径长度为 10; 若选 a 为超市,各单位到超市的距离为:0+4+18+6+25=53 若选 b 为超市,各单位到超市的距离为:6+0+30+8+35=79 若选 c 为超市,各单位到超市的距离为:9+10+0+3+10=32 若选 d 为超市,各单位到超市的距离为:18+16+18+0+5=57 若选 e 为超市,各单位到超市的距离为:15+14+12+1+0=42 综上所述,在选 c 为超市时各单位到超市的距离最短既超市 的最佳选址为:c 测试中的问题及解决
int n;
//顶点数和边数;
int e;
}Mgraph;
void CreatMgraph(Mgraph *G)
//定义创建存储类型的方法
{
int i, j, k;
printf("**************** 学 校 超 市 选 址 问 题
***********************\n"); //输出表头
程序中查找。
问题:无法正确地得到各单位间的最短距离(路径长度*频率)。
解决方法:先用弗洛伊德算法的到两点之间的最短距离,然后在
乘以各单位去超市的频率。代码如下:
for (i = 0; i<G->n; i++)
超市选址问题大润发课件

提供充足的停车设施是超市选址的重要考虑因素,特别是对 于驾车购物的消费者而言。确保有足够的停车位可以增加超 市的吸引力。
竞争对手情况
竞争对手数量与分布
了解竞争对手的数量、规模以及分布情况可以帮助评估市场竞争程度,从而制 定相应的竞争策略。
竞争对手的优势与劣势
分析竞争对手的优势和劣势可以帮助超市找出自己的定位和差异化点,从而在 竞争中脱颖而出。
建立良好口碑
通过顾客评价、社交媒体等渠道,积极回应和解 决顾客问题,提升口碑。
CHAPTER
05
未来超市选址的趋势
社区化经营模式
社区化经营模式是指超市在选址时更加注重社区的需求和特点,通过深入了解社 区居民的生活习惯、消费需求和购买偏好,为社区居民提供更加贴心、便利的购 物体验。
社区化经营模式通常以便利店、小型超市等形式出现,通过提供快捷、方便的服 务,满足社区居民的日常购物需求。
O2O线上线下融合模式
O2O线上线下融合模式是指超市将线上和线下销售渠道进行 有机结合,通过线上平台和线下实体店共同为消费者提供商 品和服务。
通过线上平台的推广和销售,超市可以扩大销售范围、提高 品牌知名度;同时,线下实体店可以为消费者提供更直观、 便捷的购物体验,增强消费者的信任感和忠诚度。
智能化选址技术应用
THANKS
感谢观看
超市选址问题大润发课 件
CONTENTS
目录
• 超市选址的重要性 • 大润发超市选址策略 • 超市选址需要考虑的因素 • 超市选址的优化建议 • 未来超市选址的趋势
CHAPTER
01
超市选址的重要性
地理位置对超市的影响
交通便利性
超市应选址在交通便利的地段, 便于顾客出行和停车,提高顾客
超市选址问题

超市选址问题.学年度第二学期2008/2009《数据结构》课程设计说明书学校超市选址问题题目:级:班名:姓学号:指导教师:2009-6-22~2009-6-26期:日计算机与信息工程系《数据结构》课程设计1、问题描述2、需求分析第 1 页《数据结构》课程设计、开发环境3、算法设计思想41 第页《数据结构》课程设计、流程图5 1 第页《数据结构》课程设计、课程设计过程中的关键算法6第 1 页《数据结构》课程设计1 第页《数据结构》课程设计1 第页《数据结构》课程设计1 第页《数据结构》课程设计7、测试及结果1 第页《数据结构》课程设计8、总结与收获第 1 页《数据结构》课程设计1 第页《数据结构》课程设计、参考文献91 第页《数据结构》课程设计10、指导教师评语程序清单附件一:#include <string.h>#include <stdio.h>#include <time.h>#include malloc.h#include <iostream.h>#define TURE 1#define FALSE 0#define OK 1#define ERROR 0#define OVERFLOW -1#define INF 32767const int MAXVEX=100;typedef char Vextype;typedef struct{; Vextype vexs[MAXVEX][MAXVEX]; //单位名称(顶点信息); //单位之间的相通情况(是否有边) int adj[MAXVEX][MAXVEX];;//单位间距离(边的长度)int dis[MAXVEX][MAXVEX];// 各单位去超市的频率; int f[MAXVEX];//顶点数和边数; int n;int e;}Mgraph;void CreatMgraph(Mgraph *G){int i,j,k;:\n); 请输入单位个数牰湩晴尨scanf(%d,&(G->n));:\n); 请输入单位间的路径数牰湩晴尨scanf(%d,&(G->e));:\n); 牰湩晴尨请输入单位名称for(i=0;i<G->n;i++){:\n,i); %d个单位名称牰湩晴尨请输入第scanf(%s,&G->vexs[i]);}1 第页《数据结构》课程设计for(i=0;i<G->n;i++) //结构体的初始化;for(j=0;j<G->n;j++){G->adj[i][j]=0;G->dis[i][j]=0;G->f[i]=0;}for(k=0;k<G->e;k++){牰湩晴尨请输入相通的两单位 (输入格式:i,j):\n);scanf(%d,%d,&i,&j);//在距离上体现为无向;牰湩晴尨请输入相同两个单位间的距离(格式:dis):\n);scanf(%d,&(G->dis[i][j]));G->adj[i][j]=1;G->adj[j][i]=1;G->dis[j][i]=G->dis[i][j];}for(k=0;k<G->n;k++){牰湩晴尨请输入第%d个单位去超市的相对频率:\n,k);scanf(%d,&(G->f[k]));}for(i=0;i<G->n;i++) //以距离和频率之积作为权值;for(j=0;j<G->n;j++){最终权值非完全无向; G->dis[i][j]*=G->f[i]; //if(G->adj[i][j]==0&&i!=j)G->dis[i][j]=INF;}}算法带权有向图求最短路径floydvoid Floyed(Mgraph *G) //{int A[MAXVEX][MAXVEX],path[MAXVEX][MAXVEX];int i,j,k,pre;int count[MAXVEX];path[][]数组for(i=0;i<G->n;i++) //初始化A[][]和for(j=0;j<G->n;j++) //置初值;{A[i][j]=G->dis[i][j];path[i][j]=-1;count[i]=0;}for(k=0;k<G->n;k++) //k代表运算步骤{for(i=0;i<G->n;i++)for(j=0;j<G->n;j++)k的一条路径更短从i经j到 if(A[i][j]>(A[i][k]+A[k][j])) //{A[i][j]=A[i][k]+A[k][j];path[i][j]=k;}}:<<endl; cout<<endl<<Floyed算法求解如下for(i=0;i<G->n;i++)for(j=0;j<G->n;j++){if(i!=j){cout<< <<i<<-><<j<<;;if(A[i][j]==INF){1 第页《数据结构》课程设计if(i!=j)潣瑵?不存在路径<<\<<endl;}else{潣瑵?路径长度为:<<A[i][j]<<\;潣瑵?路径为:<<i<< ;pre=path[i][j];while(pre!=-1){cout<<pre<<\;pre=path[pre][j];}cout<<j<<endl;}}}//以下为选择总体最优过程,然后确址;for(i=0;i<G->n;i++)for(j=0;j<G->n;j++){if(A[i][j]==INF)count[i]=0;elsecount[i]=1;}for(i=0;i<G->n;i++)if(count[i]){for(j=0;j<G->n;j++)A[i][0]+=A[i][j];}for(i=0;i<G->n;i++){k=0;if(count[i])if(A[k][0]>A[i][0])k=i;}潣瑵?超市的最佳地址为:<<G->vexs[k]<<endl; }void main(){Mgraph *Gh=NULL;Gh=(Mgraph *)malloc(sizeof(Mgraph));CreatMgraph(Gh);Floyed(Gh);}第 1 页。
超市选址课程设计

超市选址课程设计一、超市建立的背景分析 (2)二、超市设立的目的、意义 ............................ 错误!未定义书签。
三、调查结果分析 ........................................................................... 3 四、选址地点及评价与建议 ............................................................ 5 1、定性分析评述........................................................................ 5 2、定量方法分析........................................................................ 6 五、超市的总体功能定位及规模确定 ............................................. 7 1、超市的消费市场构成............................................................ 7 2、超市功能定位........................................................................ 7 3、超市规模确定........................................................................ 7 六、超市内部设施构成、作业分区及面积规划.............................. 7 1、布局的考虑因素.................................................................... 8 2、布局的具体思路.................................................................... 9 七、超市作业流程 ......................................................................... 11 八、部门、岗位设置,其职责与人员配备................................... 11 九、附件........................................................................................ 16 1、课程设计的收获与体会....................................................... 16 2、调查问卷及问卷分析.......................................................... 18 3、选址计算过程. (29)大学校园超市课程设计一、背景分析2022年,福建工程学院整体开始搬到新校区,新校区位于福州闽侯的大学城,此举有效的解决长期以来我校用地紧张的问题,为我校实现新发展带来了契机。
超市选址,

超市的选址问题生医2班 陈玉玲 2002013222背景随着生活水平的不断提高,超市这种新型的购物场所模式越来越普及,大型超市逐渐取代小卖店等初级的经营模式而成为城市居民购物的首选之处。
站在超市投资人的角度上,自然希望得到最大的利润,利润的取得与诸多因素有关,我也没有能力对其进行一一的讨论,这里仅对其中比较重要的一个方面,超市的选址——即通常我们所说的“地角”问题——做以简单的分析。
基本假设为了得到可以进行数学分析的模型,首先进行一些必要且合理的假设: 取某城市作为研究对象,将其平面图置于直角坐标系(x,y)中1.将该城市居民住宅、超市均视为一个点,不考虑街区,不考虑道路影响; 2.该城市居民区的居民收入M 关于位置成连续分布(即:M=M(x,y)); 3.不考虑外来流动人口来超市购物;4. 该城市某处单位面积上的居民在单位时间内购物量f 受距超市远近(r)、个人收入(M)的影响(即f=f(r1,r2,…,rn,M),其中n 为超市的个数,ri 为此点距第i 个超市的距离); 5. 各家超市的规模、实力相同;6. 超市的成本、税收、租金、员工薪水正比于超市营业额。
模型设居民区某处单位面积上的居民单位时间内购物全额为:f=f(r1,r2,…,rn,M)称f 为购买额度,ri 为该点到第i 个超市的距离;M 为该点的人均收入,M 只与位置有关,可由调察数据进行拟合,得到M=M(x,y)。
分以下2种情况进行讨论:1.城市中只有一家超市时,即f=f(r,M)下面分别考察r、M 对f 的影响:设r、M 对f 的影响相互独立,分别设为δ(r)、s(M),则()()m f f r s M δ=fm 为居民的购买额度的最大值(从直观上理解为收入无穷大,家住超市旁的居民的购买额度)用r/r0r0定义为当居民在该处的购买额度为他家在超市旁购买额度的一半的距离。
同样以M/M0代替由δ(0)=0得C=0,即M0定义为家住在超市旁的居民(r=0),其购买额度f 为最大的购买额度fm 的(1-1/e)倍时的收入。
24、学校超市选址问题

数学与计算机学院课程设计说明书课程名称:算法设计与分析-课程设计课程代码:7106620题目:超市选址问题年级/专业/班:学生姓名:学号:开始时间:2010 年12 月27 日完成时间:2011 年01 月07 日课程设计成绩:学习态度及平时成绩(30)技术水平与实际能力(20)创新(5) 说明书撰写质量(45)总分(100)指导教师签名:年月日目录1 引言 01。
1问题的提出 01.2国内外研究的现状 01。
3任务与分析 02 程序的主要功能 02。
1输入功能 02.2求权值功能 (1)2.3求最优功能 (1)2.4显示功能 (1)3 程序运行平台 (1)4 总体设计 (1)5 程序说明 (1)6 模块分析 (4)6。
1输入功能 (4)6。
2求权值功能 (4)6.3求最优功能 (4)6。
4显示功能 (4)7 系统测试 (5)8 结论 (5)致谢 (6)参考文献 (7)附录 (8)摘要学校超市的选址问题,一般需要考虑各个单位到它的综合距离最近.其实质是找一个综合权数最小的地点,但手工求解会造成很大的麻烦。
随着计算机科学的不断进步,为我们找到了机算的途径,大大地节约了劳动资源。
其中计算机图形学的发展,为我们提供了很多科学有效地算法。
使得计算快速,方便。
关键词:超市选址、计算机、图形学1 引言1。
1 问题的提出对于某一学校超市,其他各单位到其的距离不同,同时各单位人员去超市的频度也不同。
请为超市选址,要求实现总体最优.2.设计要求:(1)设计该问题的核心算法;(2)设计程序能有效指出学校超市可设立的地点和各单位的位置以及它们之间的有效路径;(3)程序能自动计算出最优设立点,并显示出最优设立点。
1.2国内外研究的现状不仅超市选址,其他诸多重要设施在建立前都需要对其地点,作出最优的抉择.该问题归根到底,就是要我们运用图的原理对其找到一个离各个单位综合最近的地点。
随着数学方法。
当今,数学的图理论,已经较为完善.这为我们运用计算机解决该类问题提供了条件.1.3任务与分析说到求解一个地点,实现总体最优。
超市选址课程设计报告

计算机科学与技术学院课程设计成绩单优秀:90分~100分良好:80分~89分中等:70~79分及格:60~69分不及格0分~59分武汉科技大学计算机科学与技术学院制表计算机科学与技术学院课程设计报告课程名称:数据结构课程设计专业:计算机科学与技术班级:2011级03班学号:201113137131姓名:彭伟华指导老师:李顺新2013年9月20日计算机科学与技术专业课程设计任务书便利店选址摘要:该课题是为小区内的某一便利店选址,要求实现总体最优,这是带权的最小生成树的问题,小区平面图采用邻接矩阵表示,设计小区的平面图是一有向网,边表示各单位到便利店的路径,边上的权值表示路径的长度。
关键词:权邻接矩阵有向网1 引言1.1课题背景便利店的选址问题是一个很复杂的决策过程,既需要定性分析,又需要定量计算。
选址问题主要取决于店铺位置的地形特点及其周围的人口状况、城市设施状况、交通条件、地租成本和竞争环境等,正确的选址决策能在减少投资运行成本的同时提高经济效益。
近几年,由于选址数据的愈加复杂以及计算机技术的迅速发展,人们开始利用计算机的强大计算能力对选址数据进行分析计算,从而决定最佳的选址方案。
1.2课程设计目的数据结构是计算机学科实践性很强的一门核心课程。
课程设计是加强学生实践能力的一个强有力手段,要求学生掌握数据结构的应用、算法的编写、类C语言的算法转换成C(C++)程序并上机调试的基本方法,还要求学生在完成程序设计的同时能够写出比较规范的设计报告。
严格实施课程设计这一环节,对于学生基本程序设计素养的培养和软件工作者工作作风的训练,将起到显著的促进作用。
1.3 课程设计任务对于某一小区便利店,其他各栋楼到其的距离不同,同时各栋楼的居民数也各不相同,不考虑各居民去超市的频率,请为便利店选址,要求实现总体最优,方便更多的住户购物。
【提示】1)便利店无论选址何处,八栋楼的居民均可直接到达,即八栋楼与便利店均相邻,且距离为直线距离;2)八栋楼的居民人数为权重,应该方便大多数人,实现总体最优。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构课程设计报告设计题目:学校超市选址问题专业计算机科学与技术班级10计本2班学生朱冬学号********联系方式180****0381年学期问题描述对于某一学校超市,其他各单位到其的距离不同,同时各单位人员去超市的频度也不同。
请为超市选址,要求实现总体最优。
1、需求分析核心问题:求最短路径(选址的要求就是超市到各单位权值之和最少)数据模型(逻辑结构):带权有向图 (权值计算: 距离*频度)存储结构: typedef struct{string vexs[MAX_VERTEX_SIZE];int arcs[MAX_VERTEX_SIZE][MAX_VERTEX_SIZE];int vexnum;// ,arcnum;}MGraph;核心算法: Floyd算法(弗洛伊德算法-每一对顶点之间的最短路径)输入数据:各单位名称,距离,频度,单位个数.输出数据:所选单位名称.总体思路:如果超市是要选在某个单位,那么先用floyd算法得出各顶点间的最短距离/最小权值。
假设顶点个数有n个,那么就得到n*n的一张表格,arcs(i,j)表示i单位到j单位的最短距离/最小权值 , 这张表格中和最小的那一行(假设为第t行),那么超市选在t单位处就是最优解。
运行环境DEV-C++2、概要设计Floyd算法利用动态规划思想,通过把问题分解为子问题来解决任意两点见的最短路径问题。
设G=(V, E, w)是一个带权有向图,其边V={v1, v2, …, vn}。
对于k≤n,考虑其结点V的一个子集。
对于V中任何两个结点vi、vj,考虑从vi到vj的中间结点都在vk中的所有路径,设是其中最短的,并设的路径长度为。
如果结点vk不在从vi到vj的最短路径上,则;反之则可以把分为两段,其中一段从vi到vk,另一段从vk到vj,这样便得到表达式。
上述讨论可以归纳为如下递归式:原问题转化为对每个i和j求,或者说求矩阵流程图3、详细设置第一步,让所有路径加上中间顶点1,取A[i][j]与A[i][1]+A[1][j]中较小的值作A[i][j]的新值,完成后得到A(1),如此进行下去,当第k步完成后,A(k)[i][j]表示从i到就且路径上的中间顶点的路径的序号小于或等于k的最短路径长度。
当第n-1步完成后,得到A (n-1),A(n-1)即所求结果。
A(n-1)[i][j]表示从i到j且路径上的中点顶点的序号小于或等于n-1的最短路径长度,即A(n-1)[i][j]表示从i到j的最短路径长度。
代码表示如下:void Floyed(Mgraph *G) //带权有向图求最短路径floyd算法{int A[MAXVEX][MAXVEX],path[MAXVEX][MAXVEX];int i,j,k,pre;int count[MAXVEX];for(i=0;i<G->n;i++) //初始化A[][]和path[][]数组for(j=0;j<G->n;j++) //置初值;{A[i][j]=G->dis[i][j];path[i][j]=-1;count[i]=0;}for(k=0;k<G->n;k++) //k代表运算步骤{for(i=0;i<G->n;i++)for(j=0;j<G->n;j++)if(A[i][j]>(A[i][k]+A[k][j])) //从i经j到k的一条路径更短{A[i][j]=A[i][k]+A[k][j];path[i][j]=k;}}cout<<endl<<"Floyed算法求解如下:"<<endl;for(i=0;i<G->n;i++)for(j=0;j<G->n;j++){if(i!=j){cout<<" "<<i<<"->"<<j<<";";if(A[i][j]==INF){if(i!=j)cout<<"不存在路径"<<"\n"<<endl;}else{cout<<"路径长度为:"<<A[i][j]<<"\n";cout<<"路径为:"<<i<<"*";pre=path[i][j];while(pre!=-1){cout<<pre<<"\n";pre=path[pre][j];}cout<<j<<endl;}}}//以下为选择总体最优过程,然后确址;for(i=0;i<G->n;i++)for(j=0;j<G->n;j++){if(A[i][j]==INF)count[i]=0;elsecount[i]=1;}for(i=0;i<G->n;i++)if(count[i]){for(j=0;j<G->n;j++)if(i!=j)A[i][i]+=A[j][i];}k=0;for(i=0;i<G->n;i++){if(count[i])if(A[k][k]>A[i][i])k=i;}cout<<"超市的最佳地址为:"<<G->vexs[k]<<endl; }4、调试分析测试数据:输入:单位个数4单位间的路径数6第0个单位名称a第1个单位名称b第2个单位名称c第3个单位名称d相通两单位之间的距离0,1 31,2 22,3 20,3 30,2 41,3 1第0个单位去超市的频率 1第1个单位去超市的频率 2第2个单位去超市的频率 4第3个单位去超市的频率 3输出:相通两单位之间的路径和他的长度结果:附加程序#include <string.h>#include <stdio.h>#include <stdlib.h>#include <time.h>#include "malloc.h"#include <iostream.h>#define TURE 1#define FALSE 0#define OK 1#define ERROR 0#define OVERFLOW -1#define INF 32767const int MAXVEX=100;typedef char Vextype;typedef struct{Vextype vexs[MAXVEX][MAXVEX]; //单位名称(顶点信息);int adj[MAXVEX][MAXVEX]; //单位之间的相通情况(是否有边);int dis[MAXVEX][MAXVEX]; //单位间距离(边的长度);int f[MAXVEX]; //各单位去超市的频率;int n; //顶点数和边数;int e;}Mgraph;void CreatMgraph(Mgraph *G){int i,j,k;printf("请输入单位个数:\n");scanf("%d",&(G->n));printf("请输入单位间的路径数:\n");scanf("%d",&(G->e));printf("请输入单位名称:\n");for(i=0;i<G->n;i++){printf("请输入第%d个单位名称:\n",i);scanf("%s",&G->vexs[i]);}for(i=0;i<G->n;i++) //结构体的初始化;for(j=0;j<G->n;j++){G->adj[i][j]=0;G->dis[i][j]=0;G->f[i]=0;}for(k=0;k<G->e;k++){printf("请输入相通的两单位(输入格式:i,j):\n");scanf("%d,%d",&i,&j);//在距离上体现为无向;printf("请输入相同两个单位间的距离(格式:dis):\n");scanf("%d",&(G->dis[i][j]));G->adj[i][j]=1;G->adj[j][i]=1;G->dis[j][i]=G->dis[i][j];}for(k=0;k<G->n;k++){printf("请输入第%d个单位去超市的相对频率:\n",k);scanf("%d",&(G->f[k]));}for(i=0;i<G->n;i++) //以距离和频率之积作为权值;for(j=0;j<G->n;j++){G->dis[i][j]*=G->f[i]; //最终权值非完全无向;if(G->adj[i][j]==0&&i!=j)G->dis[i][j]=INF;}}void Floyed(Mgraph *G) //带权有向图求最短路径floyd算法{int A[MAXVEX][MAXVEX],path[MAXVEX][MAXVEX];int i,j,k,pre;int count[MAXVEX];for(i=0;i<G->n;i++) //初始化A[][]和path[][]数组for(j=0;j<G->n;j++) //置初值;{A[i][j]=G->dis[i][j];path[i][j]=-1;count[i]=0;}for(k=0;k<G->n;k++) //k代表运算步骤{for(i=0;i<G->n;i++)for(j=0;j<G->n;j++)if(A[i][j]>(A[i][k]+A[k][j])) //从i经j到k的一条路径更短{A[i][j]=A[i][k]+A[k][j];path[i][j]=k;}}cout<<endl<<"Floyed算法求解如下:"<<endl;for(i=0;i<G->n;i++)for(j=0;j<G->n;j++){if(i!=j){cout<<" "<<i<<"->"<<j<<";";if(A[i][j]==INF){if(i!=j)cout<<"不存在路径"<<"\n"<<endl;}else{cout<<"路径长度为:"<<A[i][j]<<"\n";cout<<"路径为:"<<i<<"*";pre=path[i][j];while(pre!=-1){cout<<pre<<"\n";pre=path[pre][j];}cout<<j<<endl;}}}//以下为选择总体最优过程,然后确址;for(i=0;i<G->n;i++)for(j=0;j<G->n;j++){if(A[i][j]==INF)count[i]=0;elsecount[i]=1;}for(i=0;i<G->n;i++)if(count[i]){for(j=0;j<G->n;j++)if(i!=j)A[i][i]+=A[j][i];}k=0;for(i=0;i<G->n;i++){if(count[i])if(A[k][k]>A[i][i])k=i;}cout<<"超市的最佳地址为:"<<G->vexs[k]<<endl; }int main(){Mgraph *Gh=NULL;Gh=(Mgraph *)malloc(sizeof(Mgraph));CreatMgraph(Gh);Floyed(Gh);system("pause");}。