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]\),无论路径如何变更,都不影响这个常量的存在,所以原来的最短路依然保留
(当然我的证明含糊如放屁)
所以我们可以直接用这个算法解决一些特殊的问题
Johnson算法:多源最短路算法的更多相关文章
- Dijkstra算法——单源最短路算法
一.介绍 迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他各个节点的最短路径. 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止. 适用于有 ...
- [ACM_图论] Domino Effect (POJ1135 Dijkstra算法 SSSP 单源最短路算法 中等 模板)
Description Did you know that you can use domino bones for other things besides playing Dominoes? Ta ...
- 最短路模板(Dijkstra & Dijkstra算法+堆优化 & bellman_ford & 单源最短路SPFA)
关于几个的区别和联系:http://www.cnblogs.com/zswbky/p/5432353.html d.每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个(草儿家到 ...
- 【算法】单源最短路——Dijkstra
对于固定起点的最短路算法,我们称之为单源最短路算法.单源最短路算法很多,最常见的就是dijkstra算法. dijkstra主要用的是一种贪心的思想,就是说如果i...s...t...j是最短路,那么 ...
- 【学习笔记】 Johnson 全源最短路
前置扯淡 一年多前学的最短路,当时就会了几个名词的拼写,啥也没想过 几个月之前,听说了"全源最短路"这个东西,当时也没说学一下,现在补一下(感觉实在是没啥用) 介绍 由于\(spf ...
- 近十年one-to-one最短路算法研究整理【转】
前言:针对单源最短路算法,目前最经典的思路即标号算法,以Dijkstra算法和Bellman-Ford算法为根本演进了各种优化技术和算法.针对复杂网络,传统的优化思路是在数据结构和双向搜索上做文章,或 ...
- 近十年one-to-one最短路算法研究整理
前言:针对单源最短路算法,目前最经典的思路即标号算法,以Dijkstra算法和Bellman-Ford算法为根本演进了各种优化技术和算法.针对复杂网络,传统的优化思路是在数据结构和双向搜索上做文章,或 ...
- 最短路算法之 Dijkstra算法
Dijkstra算法 Dijkstra算法是典型最短路算法,用于计算一个节点到其它全部节点的最短路径. 主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法能得出最短路径的最 ...
- 最短路算法详解(Dijkstra/SPFA/Floyd)
新的整理版本版的地址见我新博客 http://www.hrwhisper.me/?p=1952 一.Dijkstra Dijkstra单源最短路算法,即计算从起点出发到每个点的最短路.所以Dijkst ...
随机推荐
- MySQL里默认的几个库是干啥的?
本文涉及:MySQL安装后自带的4个数据库:information_schema. performance_schema.sys.mysql的作用及其中各个表所存储的数据含义 information_ ...
- spark和深度学习集成调研
http://dy.163.com/v2/article/detail/E2TMAOTU0518KCLV.html http://www.elecfans.com/d/676451.html http ...
- 【Java并发编程】24、Synchronized实现原理解析
一.概述 我们知道在JDK1.5之前synchronized是一个重量级锁,相对于j.u.c.Lock,它会显得那么笨重,以至于我们认为它不是那么的高效而慢慢摒弃它. 不过,随着后续Java版本更新对 ...
- iOS - 架构的认识过程,悬崖勒马。
16年的时候写过一篇代码讲解的,依旧是这三种架构,现在20年将近了,看到好的文章,是否增加新的认识. 16年链接 iOS - 架构模式 - 解密 MVC.MVP.MVVM.VIPER架构 新项目选择架 ...
- Node.js 中 exports 和 module.exports 的区别
每一个模块中都有一个 module 对象, module 对象中有一个 exports 对象 我们可以把需要导出的成员都放到 module.exports 这个接口对象中,也就是 module.exp ...
- elementUI 2个输入框 时间区间月份选择
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Vue Nginx反向代理配置 解决生产环境跨域
Vue本地代理举例: module.exports = { publicPath: './', devServer: { proxy: { '/api': { target: 'https://mov ...
- 创建简易的SpringBoot项目
创建简易的SpringBoot项目 这两天在学习springboot,菜鸟刚刚知道这个东西,看着springboot项目下那一大堆目录都不知道从何下手,还是静下心来从最简单的创建一个项目入手,这路和大 ...
- Java下载文件解决中文乱码问题
直接上代码 /** * @desc 下载已存在的文件 */ public void sendFile(HttpServletRequest request, HttpServletResponse r ...
- Httpd服务入门知识-Httpd服务常见配置案例之日志设定
Httpd服务入门知识-Httpd服务常见配置案例之日志设定 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.日志类型 [root@node101.yinzhengjie.org ...