当前位置: 首页 > news >正文

有向图最短路径 java_Dijkstra算法-寻找有向图中最短路径

Dijkstra算法是由荷兰计算机科学家艾兹格·迪科斯彻发现的。算法解决的是有向图中最短路径问题。

举例来说,如果图中的顶点表示城市,而边上的权重表示著城市间开车行经的距离。 Dijkstra算法可以用来找到两个城市之间的最短路径。

Dijkstra算法的输入包含了一个有权重的有向图G,以及G中的一个来源顶点S。 我们以V表示G中所有顶点的集合。图中的每一个边,都是两个顶点所形成的有序元素对。(u,v)表示从顶点u到v有路径相连。 假设E为所有边的集合,而边的权重则由权重函数w: E → [0, ∞]定义。 因此,w(u,v)就是从顶点u到顶点v的非负花费值(cost)。 边的花费可以想像成两个顶点之间的距离。任两点间路径的花费值,就是该路径上所有边的花费值总和。 已知有V中有顶点s及t,Dijkstra算法可以找到s到t的最低花费路径(i.e. 最短路径)。 这个算法也可以在一个图中,找到从一个顶点s到任何其他顶点的最短路径。

算法描述

这个算法是通过为每个顶点v保留目前为止所找到的从s到v的最短路径来工作的。初始时,源点s的路径长度值被赋为0(d[s]=0), 同时把所有其他顶点的路径长度设为无穷大,即表示我们不知道任何通向这些顶点的路径(对于V中所有顶点v除s外d[v]= ∞)。当算法结束时,d[v]中储存的便是从s到v的最短路径,或者是无穷大(如果路径不存在的话)。

Dijstra算法的基础操作是边的拓展:如果存在一条从u到v的边,那么从s到v的最短路径可以通过将边(u,v)添加到s到u的尾部来拓展。这条路径的长度是d[u]+w(u,v)。如果这个值比目前已知的d[v]的值要小,我们可以用新值来替代当前d[v]中的值。拓展边的操作一直执行到所有的d[v]都代表从s到v最短路径的花费。这个算法经过适当的组织因而当d[u]达到它最终的值的时候,每条边(u,v)都只被拓展一次。

算法维护两个顶点集S和Q。集合S保留了我们已知的所有d[v]的值已经是最短路径的值顶点,而集合Q则保留其他所有顶点。集合S初始状态为空,而

后每一步都有一个顶点从Q移动到S。这个被选择的顶点是Q中拥有最小的d[u]值的顶点。当一个顶点u从Q中转移到了S中,算法对每条外接边(u,v)进

行拓展。

算法思想

设S为最短距离已确定的顶点集(看作红点集),V-S是最短距离尚未确定的顶点集(看作蓝点集)。

①初始化

初始化时,只有源点s的最短距离是已知的(SD(s)=0),故红点集S={s},蓝点集为空。

②重复以下工作,按路径长度递增次序产生各顶点最短路径

在当前蓝点集中选择一个最短距离最小的蓝点来扩充红点集,以保证按路径权重递增的次序来产生各顶点的最短路径。

当蓝点集中仅剩下最短距离为∞的蓝点,或者所有蓝点已扩充到红点集时,s到所有顶点的最短路径就求出来了。

注意:

①若从源点到蓝点的路径不存在,则可假设该蓝点的最短路径是一条长度为无穷大的虚拟路径。

②从源点s到终点v的最短路径简称为v的最短路径;s到v的最短路径长度简称为v的最短距离,并记为SD(v)。

(3)在蓝点集中选择一个最短距离最小的蓝点k来扩充红点集

根据按长度递增序产生最短路径的思想,当前最短距离最小的蓝点k的最短路径是:

源点,红点1,红点2,…,红点n,蓝点k

距离为:源点到红点n最短距离+边长

为求解方便,设置一个向量D[0..n-1],对于每个蓝点v∈ V-S,用D[v]记录从源点s到达v且除v外中间不经过任何蓝点(若有中间点,则必为红点)的"最短"路径长度(简称估计距离)。

若k是蓝点集中估计距离最小的顶点,则k的估计距离就是最短距离,即若D[k]=min{D[i]

i∈V-S},则D[k]=SD(k)。

初始时,每个蓝点v的D[c]值应为权w,且从s到v的路径上没有中间点,因为该路径仅含一条边

注意:

在蓝点集中选择一个最短距离最小的蓝点k来扩充红点集是Dijkstra算法的关键

(4)k扩充红点集s后,蓝点集估计距离的修改

将k扩充到红点后,剩余蓝点集的估计距离可能由于增加了新红点k而减小,此时必须调整相应蓝点的估计距离。

对于任意的蓝点j,若k由蓝变红后使D[j]变小,则必定是由于存在一条从s到j且包含新红点k的更短路径:P=。且D

[j]减小的新路径P只可能是由于路径和边组成。

所以,当length(P)=D[k]+w小于D[j]时,应该用P的长度来修改D[j]的值。

(5)Dijkstra算法

Dijkstra(G,D,s){

//用Dijkstra算法求有向网G的源点s到各顶点的最短路径长度

//以下是初始化操作

S={s};D[s]=0; //设置初始的红点集及最短距离

for( all i∈ V-S )do //对蓝点集中每个顶点i

D[i]=G[s][i]; //设置i初始的估计距离为w

//以下是扩充红点集

for(i=0;i

D[k]=min{D[i]:all i V-S}; //在当前蓝点集中选估计距离最小的顶点k

if(D[k]等于∞)

return; //蓝点集中所有蓝点的估计距离均为∞时,

//表示这些顶点的最短路径不存在。

S=S∪{k}; //将蓝点k涂红后扩充到红点集

for( all j∈V-S )do //调整剩余蓝点的估计距离

if(D[j]>D[k]+G[k][j])

//新红点k使原D[j]值变小时,用新路径的长度修改D[j],

//使j离s更近。

D[j]=D[k]+G[k][j];

}

}

相关文章:

  • 什么是java枚举类型_java枚举类型
  • java弹出图片_Java对话框上显示图片
  • java date获取24点_android中在java代码中获得每日,每周,每月的0点和24点的时间戳
  • java mutilcatch_Java中的Multicatch,不同的catch块 - Break易站
  • java hashtable线程安全_基础才是重中之重~线程安全的Hashtable
  • java poi excel 图表_Java使用POI解析Excel表格
  • java xml 查询_JAVA操作XML的完整例子(查询、增加、修改、删除)
  • labview和python脚本_通过python节点将字典从LabVIEW传递到python脚本
  • mysql克隆master_MySQL复制(二)Master-Slave复制实践
  • java map 平均值_使用Java 8获取两个HashMap的平均值
  • python中给出一个不超过10的正整数n_大学python题 求大佬解答!!!
  • docker建多个mysql_在Linux下使用Docker-compose建立多个数据库
  • 平安科技java在线考试_都有哪些开源的在线考试系统?
  • java clone性能比较_Java深度拷贝方式和性能对比
  • 老黄历java_基于聚合数据的老黄历接口调用示例-JAVA版
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • Centos6.8 使用rpm安装mysql5.7
  • Druid 在有赞的实践
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • Java,console输出实时的转向GUI textbox
  • js
  • oldjun 检测网站的经验
  • python3 使用 asyncio 代替线程
  • 前端面试题总结
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 什么软件可以剪辑音乐?
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 项目实战-Api的解决方案
  • 小程序开发中的那些坑
  • 责任链模式的两种实现
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • ​【已解决】npm install​卡主不动的情况
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • (10)STL算法之搜索(二) 二分查找
  • (7)svelte 教程: Props(属性)
  • (强烈推荐)移动端音视频从零到上手(上)
  • (一)RocketMQ初步认识
  • (转)Unity3DUnity3D在android下调试
  • .net mvc 获取url中controller和action
  • .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(二)...
  • .NET/C# 使用 SpanT 为字符串处理提升性能
  • .NET/MSBuild 中的发布路径在哪里呢?如何在扩展编译的时候修改发布路径中的文件呢?
  • .Net的DataSet直接与SQL2005交互
  • .net中应用SQL缓存(实例使用)
  • @RequestMapping处理请求异常
  • [1]-基于图搜索的路径规划基础
  • [Android] Implementation vs API dependency
  • [ASP.NET MVC]如何定制Numeric属性/字段验证消息
  • [Docker]十.Docker Swarm讲解
  • [echarts] y轴不显示0
  • [HackMyVM]靶场Boxing
  • [Hadoop in China 2011] 蒋建平:探秘基于Hadoop的华为共有云
  • [HNOI2008]玩具装箱toy
  • [LeetCode]剑指 Offer 42. 连续子数组的最大和