- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
数据结构与算法dixtra
数据结构上机报告
名称:狄克斯特拉算法
姓 名:
学 号: 310
班 级: 计算101
实验日期: 2012.11.22
指导教师:
问题描述:
带权图中从一个结点到另一个结点可能存在着多条路径,带权路径长度值最小的那条路径称为最短路径,狄克斯特拉提出了一个按路径长度递增的顺序逐步产生最短路径的构造算法。用狄克斯特拉算法编一个程序求带权图的最短路径。如下图是一个有向带权图及其邻接矩阵。该带权图从结点A到结点D有三条路径,分别为路径(A,D),其带权路径长度为30;路径(A,C,F,D),其带权路径长度为22;路径(A,C,B,E,D),其带权路径长度为32。路径(A,C,F,D)称为最短路径,其带权路径长度22称为最短距离。
EFD
E
F
D
B
C
A
基本要求:
1.测试数据由用户在程序中给出。
2.在狄克斯特拉函数设计中把函数设计成一个循环迭代过程。
3.输入边信息数据时,以其在邻接矩阵的(行下标,列下标,权值)形式输入。
4.要求输出固定结点到各结点的最短距离和最短路径的前一结点。
测试数据:
结点:a[]={A,B,C,D,E,F};
边:rcw[]={{0,2,5},{0,3,30},{1,0,2},{1,4,8},{2,1,15},{2,5,7},{4,3,4},
{5,3,10},{5,4,18}};
算法思想:
设计两个结点的集合S和T,集合S中存放已找到最短路径的结点,集合T中存放当前还未找到最短路径的结点。初始状态时,集合S中只包含源点,设为v0,然后不断从集合T中选择到源点v0路径长度最短的结点u加入到集合S中,集合S中每加入一个新的结点u都要修改从源点v0到集合T中剩余结点的当前最短路径长度值,集合T中各结点的新的当前最短路径长度值,为原来的最短路径长度值与从源点过结点u到达该结点的路径长度中的较小者。此过程不断重复,直到集合T中的结点全部加入到集合S中为止。
模块划分:
(1).文件“SeqList.h”,用于下文件“AMGraph.h”,其中包括顺序表的初始化、求当前数据元素个数、插入、删除、取数据元素操作;
(2).文件“AMGraph.h”,有初始化、插入结点、插入边、删除边、删除结点、寻找邻接结点和邻接结点的下一邻接结点的操作;
(3).文件“AMGraphC.h”,用于图的创建;
(4).文件“Dijkstra.h”,狄克斯特拉函数的设计;
(5).文件“Main.c”,输出结点A到其他结点的最短距离和最短路径的前一结点。
数据结构:
线性表数据结构:
typedef struct
{
DataType list[MaxSize];
int size;
}SeqList;
图的数据结构:
typedef struct
{
SeqList Vertices; /*存放结点的顺序表*/
int edge[MaxVertices][MaxVertices]; /*存放边的邻接矩阵*/
int numOfEdges; /*边的条数*/
}AMGraph; /*图的结构体定义*/
边的数据结构
typedef struct
{
int row; /*行下标*/
int col; /*列下标*/
int weight; /*权值*/
}RowColWeight; /*边信息结构体定义*/
源程序:
文件“SeqList.h”
/*定义结构体*/
typedef struct
{
DataType list[MaxSize];
int size;
}SeqList;
/*初始化*/
void ListInitiate(SeqList *L)
{
L-size=0;
}
/*求当前数据元素个数*/
int ListLength(SeqList L)
{
return L.size;
}
/*插入数据元素*/
int ListInsert(SeqList *L,int i,DataType x)
{
int j;
if(L-size=MaxSize)
{
printf(顺序表已满无法插入!\n);
return 0;
}
else if(i0||iL-size)
{
printf(参数i不合法!\n);
return 0;
}
else
{
/*为插入做准备*/
for(j=L-size;ji;j--) L-list[j]=L-list[j-1];
L-list[i]=x; /*插入x*/
L-size++; /*元素个数加*/
文档评论(0)