欢迎来到天天文库
浏览记录
ID:31365416
大小:111.00 KB
页数:7页
时间:2019-01-09
《dijkstra算法设计与实现》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、Dijkstra算法设计与实现 摘要:最短路径算法在各领域应用广泛,大多《离散数学》的图论部分最短路径算法讲解较为粗略,不便于学生学习和实践。经过多年教学总结,对最短路径算法给出设计和实现,有利于学生对本知识的掌握和实践应用。 关键词:最短路径;离散数学;Dijkstra算法 中图分类号:TP311文献标识码:A文章编号:1009-3044(2016)28-0079-02 1概述 最短路径问题是指在一个非负权值图中找出两个指定节点间的一条权值之和最小的路径。Dijkstra算法在很多计算机专业可均有介绍,如数据结构,离散数学等,但大都比较粗略。迪克斯特拉算法是经典的
2、求解最短路径问题的方法,是按路径长度递增的次序来产生最短路径的算法[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的所有边的权值之和,7记作w(L),u和v之间的最短路径指的是u和v之间边权最小的通路[2]。
3、3Dijkstra算法描述 1)算法基本过程:设带权图G=,把图G中顶点集合V分成两个子集,第一个子集是已求出最短路径的顶点集合,用V1表示,初始化时V1中只有一个起源点,以后每求得一条最短路径,就将被选定点加入到集合V1中,直到图中全部顶点都依次添加到到V1中,算法就结束了;第二个集合为G中其余未确定最短路径的顶点集合,用V2表示,按最短路径长度的递增次序依次把第二个集合V2中的被选顶点加入集合V1中。特别,在加入的过程中,总保持从起源点v0到V1中各顶点的最短路径长度不大于从源点v0到V2中任何顶点的最短路径长度。此外,每个顶点对应一个距离,V1中的顶点的距离就是从v0
4、到此顶点的最短路径长度,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)
5、v∈U),把k加入V1中(该选定的距离就是v0到k的最短路径长度)。此时V1=V1∪{k},
6、同时V2集合中删除k点,即V2=V2-{k}。7 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 #defineM100 #defin
7、eN100 usingnamespacestd; typedefstructnode {intm[N][M];//邻接矩阵 intn;//顶点数 inte;//边数 }MGraph; voidDpath(MGraphg,int*dist,int*path,intv0)//v0表示源点 {inti,j,k;7 bool*ved=(bool*)malloc(sizeof(bool)*g.n); for(i=0;i0&&i!=v0) {dist[i]=g.m[v0][i]; path[i]=v0;
8、}//path记录最短路径上从v0到i的前一个顶点 else {dist[i]=INT_MAX;//若i不与v0直接相邻,则权值置为无穷大 path[i]=-1;} ved[i]=false; path[v0]=v0; dist[v0]=0;} ved[v0]=true; for(i=1;i
此文档下载收益归作者所有