- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
旅行售货员问题的报告
实验题目 旅行售货员问题
由于实验室安排的时间有冲突,现定于本周(11周)四上午上实验课,实验内容如下:
四、旅行售货员问题
[基本要求]
可用一个带权有向图表示某一区域的公交线路网(可自行设定公交网),图中顶点表示区域内的销售点,有向边表示已有的公交路线,边上的权值表示票价。要求:
1、自行设计存储结构,并说明为什么采用该存储结构。
2、某一源点到其他各顶点的最少票价,该源点由用户指点并从键盘输入。(参考迪杰斯特拉算法)
3、计算每一对顶点之间的最少票价及路径,并输出。(参考佛罗伊德算法)
可采用菜单方式实现以上操作的选择。
此次实验为综合性实验,希望同学们能认真完成实验报告(模板我会在近期内发给大家)。
实验报告
实验目的与要求
1、掌握图的抽象数据类型及存储表示方式;
2、掌握求源点到其余各顶点最短路径的算法;
3、掌握求每一对顶点最短路径的算法;
实验方案
通常我们坐车最关心的是从原点到终点的所消耗的花费,并不关心所经站点的信息。借助于邻接矩阵容易判定任意两个顶点之间是否有边相连,并容易知道连接2个顶点的弧的代价。所以采取邻接矩阵的存储结构。
迪杰斯特拉 (Dijkstra) 提出了一个按路径长度递增的顺序产生最短路径的方法。此方法的基本思想是:把图中所有的顶点分成两组,第一组包括已确定最短路径的顶点,第二组包括尚未确定最短路径的顶点,按最短路径长度递增的顺序逐个把第二组的顶点加到第一组中去,直至从 v 1 出发可以到达的所有顶点都包括在第一组中。在这个过程中,总保持从 v 1 到第一组各顶点的最短路程长度,都不大于从 v 1 到第二组的任何顶点的最短路径长度。另外,每一个顶点对应一个距离值,第一组的顶点对应的距离值就是从 v 1 到此顶点的只包括第一组的顶点为中间顶点的最短路径长度。而我将采用此算法求解源点到其余各顶点的最短路径。
弗洛伊德(floyd)算法的基本思想:设求顶点vi到vj间的最短路径,若vi到vj有弧,则弧上的权值是一条路径,但未必是最短路径,要经过n-1次测试。首先将顶点v1加入,即看(vi,v1),(v1,vj)是否有路径,且比(vi,vj)低,如是,则用后两段路径代替,并称这是vi到vj中间顶点序号不大于1的最短路径。再将顶点v2加入,得到vi到vj中间顶点序号不大于2的最短路径。如此下去,直到vn加入,得到vi到vj中间顶点序号不大于n的最短路径,算法结束。而我将采用此算法求解每一对顶点的最短路径。
#include string.h
#include stdio.h
#define M 1000
#define N 6
typedef struct ArcCell{
int adj; /*相邻接的地方序号*/
}ArcCell; /*定义边的类型*/
typedef struct VertexType{
int number; /*地方序号*/
char *place; /*地方名称*/
}VertexType; /*定义顶点的类型*/
typedef struct{
VertexType vex[N]; /*图中的顶点,即为地方*/
ArcCell arcs[N][N]; /*图中的边,即为地方间的距离*/
int vexnum,arcnum; /*顶点数,边数*/
}MGraph; /*定义图的类型*/
MGraph G; /*把图定义为全局变量*/
int P[N][N];
long int D[N];
void CreateDN(v,a) /*造图函数*/
int v,a;
{ int i,j;
G.vexnum=v;
G.arcnum=a;
for(i=0;iG.vexnum;++i) G.vex[i].number=i;
/*下边是地方名*/
G.vex[0].place=A;
G.vex[1].place=B;
G.vex[2].place=C;
G.vex[3].place=D;
G.vex[4].place=E;
G.vex[5].place=F;
/*这里把所有的边假定为M,含义是地方间不可到达*/
for(i=0;iG.vexnum;++i)
for(j=0;jG.vexnum;++j)
G.arcs[i][j].adj=M;
/*下边是可直接到达的地方间的距离*/
G.arcs[0][1].adj=6;
G.arcs[0][3].adj=7;
G.arcs[1][2].adj=1;
文档评论(0)