Johnson算法:多源最短路算法
Johnson算法
请不要轻易点击标题
一个可以在有负边的图上使用的多源最短路算法
时间复杂度\(O(n \cdot m \cdot log \ m+n \cdot m)\)
空间复杂度\(O(n+m)\)
这个神奇的算法综合利用了Dijkstra算法和Bellman-Ford算法(不要慌,虽然有负边但Dijkstra可以跑!)
在开始讲解之前,我们将其与floyd进行比较
\(floyd:\)
时间复杂度\(O(n^3)\)
空间复杂度\(O(n^2)\)
可以看出,\(floyd\)复杂度与\(m\)无关 , 可见\(floyd\)适用于稠密图的最短路,而\(Johnson\)算法则是适用于稀疏图最短路
\[\ \]
\[\ \]
\[ \ \]
\[ \ \]
我对该算法的理解
\(Johnson\)算法
限制条件:没有负环即可
在有负权边的图上,\(Dijkstra\)的转移受到限制,我们需要进行一定处理
核心 : 将边权\(reweight\),保证边权非负后,即可跑\(n\)遍\(Dijkstra\),复杂度稳定\(n \cdot m \cdot log \ m\)(相较于SPFA来说稳定很多)
\[\ \]
Reweight过程
1.建立超级源点0号节点,向\(1 - n\)号节点建立边权为0的有向边
2.利用Bellman-Ford(或SPFA)求得\(dis[0][1..n]\)
3.将边\((u,v,w)\)加上\(dis[0][u]-dis[0][v]\)
4.将Dijkstra得到的路径\(dis[u][v]\)加上\(dis[0][v]-dis[0][u]\)还原
\[\ \]
关于Reweight的正确性
----\(Step 3.\)根据三角不等式\(dis[v]<=dis[u]+w\),移项得到\(w+dis[u]-dis[v] \ge 0\),故Reweight后边权非负
----\(Step4.\)对于一条最短路\(\lbrace p_1,p_2,..,p_k\rbrace\),Reweight后更改的权值即\(dis[p1]-dis[p2]+dis[p2]-dis[p3]...-dis[p_k]\)
即\(dis[0][v]-dis[0][u]\)
----更改后 路径保留的完整性 : 由于对于任意一条路径\(dis[u][v]\),它更改的值都是一个常量\(dis[0][v]-dis[0][u]\),无论路径如何变更,都不影响这个常量的存在,所以原来的最短路依然保留
(当然我的证明含糊如放屁)
所以我们可以直接用这个算法解决一些特殊的问题
最新文章
- c#如何实现一个线程暂停,等待用户输入文本后继续运行?
- CMD复制文件夹
- 补上题代码 hdu1520
- android 入门-基础了解
- SendMessage
- Linux安装Memcached服务
- CCNA training notes
- http错误和异常处理,认证和代理设置
- 操作系统是怎么工作的——mykernel环境的搭建
- DropdownList绑定的两种方法
- 2015-01-27-从实验出发理解buffer与cache区别-吴伟顺
- dubbo No provider available for the service com.alibaba.dubbo.monitor.MonitorService from registry
- The solution for ";Eclipse is running in a JRE, but a JDK is required";
- 当执行游戏0xc000007b错误的解决方法
- amazeui 后台模板
- 图文详解linux如何搭建lamp服务环境
- Dynamics CRM2011 通过DeveloperToolkit在VS中部署遇到的问题
- es2018(es9)前瞻
- Python中map函数
- Java语法 [开发环境搭建]
热门文章
- Windows下载安装RabbitMQ教程
- mybatis关联映射一对一
- Vue -- 项目报错整理(2):IE报错 - ‘SyntaxError:strict 模式下不允许一个属性有多个定义‘ ,基于vue element-ui页面跳转坑的解决
- 英语Barklyite红宝石barklyite单词
- Java abstract关键字 抽象类 抽象方法
- WDA演练一:用户登陆界面设计(二)
- 机器学习笔记7:矩阵分解Recommender.Matrix.Factorization
- Docker搭建Zentao(禅道)
- Anaconda安装、更新第三方包
- 逆向破解之160个CrackMe —— 019