- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
实习三 【求最短路径】.doc
实习三
1.需求分析:
【问题描述】:设计一个算法,求图中一个源点到其他各顶点的最短路径。
【基本要求】:
(1)以邻接表作为存储结构。
(2)用Dijkstra算法求最短路径。
(3)按长度非递减次序打印输出最短路径的长度及相应路径。
【开发环境】:
系统:windows7
编程软件:VC++6.0
2.设计:
邻接表是一种链式存储结构。在邻接表中,对图中每个顶点建立一个单链表,第i个单链表中的结点表示依附于顶点Vi的边(对有向图是以顶点Vi为尾的弧)。每个结点由3个域组成,其中邻接点域(dest)指示与顶点Vi邻接的点在图中的位置,链域(next)指示下一条边或弧的结点;数据域(weight)存储和边或弧相关的信息,如权值等。
所以一开始必须先定义邻接表的边结点类型以及邻接表类型,并对邻接表进行初始化,然后根据所输入的相关信息,包括图的顶点数、边数、是否为有向,以及各条边的起点与终点序号,建立图的邻接表。
图的邻接表建立后,利用狄克斯特拉算法求出最短路径。狄克斯特拉算法的思想:设置两个顶点的集合S和T,集合S中存放已找到最短路径的顶点,集合T中存放当前还未找到最短路径的顶点。初始状态时,集合S中只包含源点,设为,然后从集合T中选择到源点路径长度最短的顶点u加入到集合S中,集合S中每加入一个新的顶点u,都要修改源点到集合T中剩余顶点的当前最短路径长度值,集合T中各顶点的新的当前最短路径长度值为原来的当前最短路径长度值与从源点过顶点u到达该顶点的路径长度中的较小者。此过程不断重复,直到集合T中的顶点全部加入到集合S中为止。
具体思想
如下所示的有向图
跟据如上图所示的有向图,建立如下图所示的邻接表存储结构,数组的data域存储图的顶点信息,source域存储该顶点在数组下标,这个下标也是所有以该顶点为狐尾的边在数组中的下标,adj域为该顶点的邻接顶点单链表的头指针。
其中结点结构体定义如下:
typedef struct Node{
int dest;//连接表的弧头顶点序号
int weight;
struct Node *next;//单链表的下一个结点指针
}Edge;//邻接边单链表的结点结构体
typedef struct {
DataType data;//顶点数据元素
int source;//邻接边的狐尾顶点序号
Edge *adj;//邻接边的头指针
}AdjLHeight;
typedef struct{
AdjLHeight a[MaxVertices];//邻接表数组
int numOfVerts;//顶点个数
int numOfEdges;//边个数
}AdjLGraph;//连接表结构体
typedef struct{
int row;//行下标
int col;//列下标
int weight;//权值
}RowCol;//边信息结构体
用邻接表构建图完成后,Dijkstra算法求最短路径如下:
void Dijkstra(AdjLGraph *G,int v0,int distance[],int path[])
{//带权图G从下标v0顶点到其他顶点的最短距离distance和最短路径下标path
int n=G-numOfVerts;//顶点个数
int *s=(int *)malloc(sizeof(int)*n);
int minDis,i,j,u;
Edge *p,*q;
p=G-a[v0].adj;
while(p!=NULL)
{//顶点能一次到达的,路径长度为其权值
i=p-dest;
distance[i]=p-weight;
path[i]=v0;
p=p-next;
}
for(i=0;in;i++)
{//顶点一次不能到达的,路径长度为MaxWeight
s[i]=0;
if(path[i]!=v0)
{
path[i]=-1;
distance[i]=MaxWeight;
}
}
s[v0]=1;//将序号v0包含在集合s内
distance[v0]=0;//顶点自己到自己的路径为0
for(i=0;in;i++)
{
minDis=MaxWeight;
原创力文档


文档评论(0)