Dijkstra算法设计与实现.docVIP

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Dijkstra算法设计与实现.doc

Dijkstra算法设计与实现   摘要:最短路径算法在各领域应用广泛,大多《离散数学》的图论部分最短路径算法讲解较为粗略,不便于学生学习和实践。经过多年教学总结,对最短路径算法给出设计和实现,有利于学生对本知识的掌握和实践应用。   关键词:最短路径;离散数学; Dijkstra算法   中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2016)28-0079-02   1 概述   最短路径问题是指在一个非负权值图中找出两个指定节点间的一条权值之和最小的路径。Dijkstra 算法在很多计算机专业可均有介绍,如数据结构,离散数学等,但大都比较粗略。迪克斯特拉算法是经典的求解最短路径问题的方法,是按路径长度递增的次序来产生最短路径的算法[1]。   最短路径问题描述:设n,m带权图 G=,V={v0,v1,…,vn-1},E={e1,e2,…,em},其中假设每条边ei 的权值为 wi,单源的最短路径就是从图G中找到起源点 V0 到图中其余各点的最短路径。   2 最短路径概念   带权图G=, 其中W:ER, eE,w(e)称作e的权。 若vi和vj相邻e=(vi,vj), 记w(vi,vj)=w(vi,vj) , 若vi,vj不相邻, 记w(vi,vj)=。通路L的权是指L的所有边的权值之和, 记作w(L),u和v之间的最短路径指的是 u和v之间边权最小的通路[2]。   3 Dijkstra算法描述   1)算法基本过程:设带权图G=,把图G中顶点集合V分成两个子集,第一个子集是已求出最短路径的顶点集合,用V1表示,初始化时V1中只有一个起源点,以后每求得一条最短路径 , 就将被选定点加入到集合V1中,直到图中全部顶点都依次添加到到V1中,算法就结束了;第二个集合为G中其余未确定最短路径的顶点集合,用V2表示,按最短路径长度的递增次序依次把第二个集合V2中的被选顶点加入集合V1中。特别,在加入的过程中,总保持从起源点v0到V1中各顶点的最短路径长度不大于从源点v0到V2中任何顶点的最短路径长度。此外,每个顶点对应一个距离,V1中的顶点的距离就是从v0到此顶点的最短路径长度,V2中的顶点的距离,是从v0到此顶点只包括V1中的顶点为中间顶点的当前最短路径长度。   2)算法具体步骤:   a.初始时,V1只包含源点,即V1={ v0},v0的距离为0。V2包含除v0外的其他顶点,即: V2={ v1, v2…,vn-1}。定义集合V2中的顶点的距离:若v0与V2中顶点v有边,则dist(v)=w(v0,v)正常有权值,若v0与v点不相邻,则dist(v)= ∞。   b.从V2中选取一个点k加入V1中,选择公式dist(k)=min(dist(v) | v∈U),把k加入V1中(该选定的距离就是v0到k的最短路径长度)。此时V1= V1∪{k},同时V2集合中删除k点,即V2= V2-{k}。   c.以k为新考虑的中间点,修改V2中各顶点的距离;若从源点v0到顶点v的距离(经过顶点k)比原来距离短,则修改顶点 v的距离值,否则v的距离值不变,修改公式dist(v)=min{dist(v),dist(k)+dist(k,v)}[3]。   d.重复步骤b和c直到V1=V,算法停止。   4 算法实例   1)先给出一个无向图G=,如图1所示:   用Dijkstra算法找出以A为起点的单源最短路径步骤如表1:   5 算法代码实现   测试案例如图2所示:   #include   #include   #define M 100   #define N 100   using namespace std;   typedef struct node   {int m[N][M]; //邻接矩阵   int n; //顶点数   int e; //边数   }MGraph;   void Dpath(MGraph g,int *dist,int *path,int v0) //v0表示源点   {int i,j,k;   bool *ved=(bool *)malloc(sizeof(bool)*g.n);   for(i=0;ig.n;i++) //初始化   {if(g.m[v0][i]0i!=v0)   {dist[i]=g.m[v0][i];   path[i]=v0; } //path记录最短路径上从v0到i的前一个顶点   else   {dist[i]=INT_MAX; //若i不与v0直接相邻,则权值置为无穷大   path[i]=-1; }   ved[i]=false;   path[v0

文档评论(0)

yingzhiguo + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:5243141323000000

1亿VIP精品文档

相关文档