




免费预览已结束,剩余2页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
最短路径算法Dijkstra算法 最短路径算法是图论中应用最广的算法之一。许多实际问题只需要简单的数学模型转换,它就成为一个最短路径问题。例如,从城市甲到城市乙,需要经过许多站点和不同路径、怎样选择行走路线。使从甲城市到乙城市所经过的路径最短;如果是乘公交车,那么又有怎样选择乘车方法,使费用最少或时间最短以到达目的地等。这些都是一些典型而又直接的最短路径问题。 在图的最短路径算法中,应用最广泛和最著名的算法就是Dijkstra算法,它是一个单源点的最短路径算法。所谓单源点最短路径问题是:给定带权有向图G=(V,E)和源点S,求源点s到图G中其他各个顶点的最短路径。 Dijkstra算法是一个典型的贪心算法,同时也用了动态规划的思想。它的基本思路是:按源点s到其他各个顶点的最短路径的递增顺序,依次求出第1个最短路径p 1,第2最短路径 p 2, 在求第k最短路径p k 时,需要用到已求出第1、第2、第k 1最短路径。将基本思路转换成数学语言就是:1、 求出第一最短路径:c (s, u1)=minc (s,u) | E,其中c(u,v)为边(u,v)的权值。则路径p 1 = c (s, u1)是源点s到u1的最短路径。2、假设第1、2、3、k 1最短路径p 1、p 2、p 3、p k-1已经求出,分别对应的是s到u1、u2、u3u k-1的最短路径,那么第k最短路径可由下列公式求出:P k=min minc (s,u) | E,minp i+c(u i,u) , E而且u i u1、u2、u3u k-1由此可以求出第k最短路径P k。根据上述思想,由此可以得到如下Dijkstra算法:1、 先将数据初始化,使dist数组中全为0;设无穷大为1000;2、 遍历节点,从源节点开始,标志遍历过后节点为1;3、 设置源节点的值为1000,遍历源点,根据权值确定被源点指向的节点是最短路径。4、 依次遍历第2、3n节点,遍历时权值需要进行比较,取最短权值,并更新此节点的最短路径,直到遍历结束。下面是Dijkstra算法: void dijkstra(int *dist,int mLength,bool *s,int u)if(u6)return;int i,j,temp;for(i=0;iLength;i+)disti = 0;si = false;*(s+u) = true; temp = 1000;distu = temp;for(i=1;iLength;i+)if(!si)if(mui!=0)disti = mui;elsedisti = temp;for(j=1;jLength;j+)temp = 1000;for(i=1;idisti)temp = disti;u = i;su = true;for(i=1;iLength;i+)if(!si&mui!=0)int newdist = mui+distu;if(newdistdisti)disti = newdist;现在取单源有向图举例加以说明,解释Dijkstra算法是怎样执行的:23145101010030205060图一将此图转换成矩阵,存储该图中的权值,两节点不相接的权值设为0,图中共5个节点,矩阵如下:0 10 0 30 1000 0 50 0 00 0 0 0 100 0 20 0 600 0 0 0 0开始遍历前,初始化dist数组为0,遍历源节点后,各节点的值为;1000 10 1000 30 100 将其转化为图:231451010100302050100010001003010图二遍历源节点后,将其标志为1,表示已经遍历,不需要再遍历。然后遍历第二个节点,比较权值大小,也就是用50和1000比较,然后更改3中的值为60。此时2节点中的值为10,还需加上50才是3中目前的最短路径。遍历第二个节点后,各节点中的值变为;1000 10 60 30 100。转化成图为:231451010100302050100060100301060图三遍历第三个节点,第五个节点的最短路径需要根据第四最短路径来求,第三次遍历后,各节点的值变为:1000 10 50 30 90。转化为图为:23145101010030205010005090301060 图四然后第四次遍历,比较各权值,取最小,并更改各节点的值。第四次遍历后,各节点值为:1000 10 50 30 60 将其转化为图:23145101010030205010005060301060图五最后进行第五次遍历,因为每次遍历过后都将其节点标志设为1,图中共5个节点,当遍历到源点时,程序停止,并输出源点到各节点的最短路径。第五次遍历后,各节点值为1000 10 50 30 60 这些值也就是源点到各节点的最短路径,将其转化为图:23145101010030205010005060301060图六其中图中各节点旁的数据为源点到该节点的最短路径,图中红色加粗的线代表源点到各节点所走的最短路路径。Dijkstra完整程序代码如下: #include stdafx.h#include stdafx.h#define Length 6void dijkstra(int *dist,int mLength,bool *s,int u)if(u6)/异常输入return;int i,j,temp;for(i=0;iLength;i+)/初始化数据disti = 0;si = false;*(s+u) = true;/将源点的标志设为true,表示该点已经遍历temp = 1000;/最大值distu = temp;for(i=1;iLength;i+)/初始化dist数组if(!si)if(mui!=0)disti = mui;elsedisti = temp;for(j=1;jLength;j+)/算法开始temp = 1000;for(i=1;idisti)temp = disti;u = i;printf(%dn,disti);su = true;for(i=1;iLength;i+)/更新distif(!si&mui!=0)int newdist = mui+distu;if(newdistdisti)disti = newdist;int main(int argc, char* argv)FILE *f;int mLengthLength;if(f = fopen(a2.txt,r)=NULL)printf(cant open file);return 0;int i,j;int distLength;bool sLength;for(i=1;iLength;i+)/初始化图列表for(j=0;jLen
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 压力管道取证培训课件
- 2025年环保科技行业清洁能源技术研发前景报告
- 2025年汽车行业无人驾驶汽车发展前景研究报告
- 2025年医疗健康产业对老龄化社会的应对策略与发展前景研究报告
- 嵩县2025年河南嵩县引进研究生学历人才78人笔试历年参考题库附带答案详解
- 南昌市2025江西南昌航空大学科技学院图书管理员招聘1人笔试历年参考题库附带答案详解
- 2025重庆某国有企业招聘财务助理实习生2人笔试参考题库附带答案详解
- 2025江西吉安市青原区两山人力资源服务有限公司招聘5人笔试参考题库附带答案详解
- 2025新疆兵团可克达拉市广电网络有限责任公司招聘4人笔试参考题库附带答案详解
- 2025年浙江省农发集团校园招聘(67人)笔试参考题库附带答案详解
- 2025年领导干部任前廉政法规知识考试题库(含答案)
- 2025年四川基层法律服务工作者执业核准考试仿真试题及答案一
- 信息技术基础教程(WPS版)课件 第3章 Windows 10 操作系统的使用
- 小鹿斑比题目及答案
- 中学知识竞赛试题及答案
- 2024超声法检测混凝土缺陷技术规程
- 2025-2030中国建筑行业供应链金融发展现状与前景分析
- 2025-2026学年人教版(2024)初中物理八年级上册教学计划及进度表
- 《民间纠纷调解》全套教学课件
- 医院环境感染监测制度
- 医院一键式报警系统建设与实施
评论
0/150
提交评论