简介

Johnson算法主要用于求稀疏图上的全源最短路径。其主体思想是利用重赋权值的方法把一个原问题带负权的图转化为权值非负的图。然后再使用N次Dijkstra算法以求出全源最短路。
——姜碧野《PFA算法的优化与应用》

主要步骤

  1. 新建虚点S,S向每个点连边权为0的边;
  2. 以S为起点,跑全局SPFA,求出每个点到S的距离fxf_xfx​;
  3. 把每条边边权重赋值;

设从u到v的边权为w(u,v)w(u,v)w(u,v),重赋值以后就变成了:w′(u,v)=w(u,v)+fu−fvw'(u,v)=w(u,v)+f_u-f_vw′(u,v)=w(u,v)+fu​−fv​;
以下为原因:

设原来两点s,t之间最短路途径的点为s,x1,x2,x3.....,xk,ts,x_1,x_2,x_3.....,x_k,ts,x1​,x2​,x3​.....,xk​,t,
di(s,t)=w(s,x1)+w(x1,x2)+w(x2,x3)+...+w(xk,t)di(s,t)=w(s,x_1)+w(x_1,x_2)+w(x_2,x_3)+...+w(x_k,t)di(s,t)=w(s,x1​)+w(x1​,x2​)+w(x2​,x3​)+...+w(xk​,t)
重赋值以后变成了:
di′(s,t)=w′(s,x1)+w′(x1,x2)+w′(x2,x3)+...+w′(xk,t)di'(s,t)=w'(s,x_1)+w'(x_1,x_2)+w'(x_2,x_3)+...+w'(x_k,t)di′(s,t)=w′(s,x1​)+w′(x1​,x2​)+w′(x2​,x3​)+...+w′(xk​,t)
di′(s,t)=w(s,x1)+fs−fx1+w(x1,x2)+fx1−fx2+w(x2,x3)+fx2−fx3+...+w(xk,t)+fxk−ftdi'(s,t)=w(s,x_1)+f_s-f_{x_1}+w(x_1,x_2)+f_{x_1}-f_{x_2}+w(x_2,x_3)+f_{x_2}-f_{x_3}+...+w(x_k,t)+f_{x_k}-f_{t}di′(s,t)=w(s,x1​)+fs​−fx1​​+w(x1​,x2​)+fx1​​−fx2​​+w(x2​,x3​)+fx2​​−fx3​​+...+w(xk​,t)+fxk​​−ft​
di′(s,t)=w(s,x1)+w(x1,x2)+w(x2,x3)+...+w(xk,t)+fs−ftdi'(s,t)=w(s,x_1)+w(x_1,x_2)+w(x_2,x_3)+...+w(x_k,t)+f_s-f_tdi′(s,t)=w(s,x1​)+w(x1​,x2​)+w(x2​,x3​)+...+w(xk​,t)+fs​−ft​
di′(s,t)=di(s,t)+fs−ftdi'(s,t)=di(s,t)+f_s-f_tdi′(s,t)=di(s,t)+fs​−ft​
发现,fs−ftf_s-f_tfs​−ft​这个东西是不变的,所以可得原图中两点之间的最短路径不变;

又因为三角不等式,所以有fu+w(u,v)>=fvf_u+w(u,v)>=f_vfu​+w(u,v)>=fv​,
所以:fu+w(u,v)−fv>=0f_u+w(u,v)-f_v>=0fu​+w(u,v)−fv​>=0,可知重赋值后全局边权为非负数;

所以,这样处理完以后就可以愉快的跑DIJ了。

【技巧】浅谈Johnson算法相关推荐

  1. music算法_“要热爱 请深爱”系列(5)浅谈模拟退火算法

    黄乐天 浅谈模拟退火算法 背景 在实际生活中, 数学问题中,我们常常会遇到(一定范围内)函数求最值的问题.一般可以用数学方式解答,但如果遇到如下恶心的函数: 它的函数图像是这样的: 我们只好用计算机科 ...

  2. 浅谈PPO算法-玩转月球登陆

    浅谈PPO算法-玩转月球登陆 前言 github 什么是Actor-Critic? Actor-Critic代码 ppo算法 实现 前言 总感觉强化学习公式真难学,也难表达心中所想,我还是白话强化学习 ...

  3. 浅谈匈牙利算法(二分图最大匹配)

    前置知识 一张图是二分图,当且仅当它的点可以被分成两部分,而这张图上的所有边的两个端点,都分属不同的部分.我们称这两个点集,一个叫左部,一个叫右部.左部中的点叫左部点:右部中的点叫右部点. 一张图的一 ...

  4. 浅谈排序算法:冒泡排序法和选择排序法的区别

    之前学习了冒泡排序法和选择排序法,最近被老师问某个道题用的是什么排序法.自己居然答不出来,才发现自己没有真正弄懂,这两个算法的原理和区别,所以····· 1冒泡排序法 1.1什么是冒泡排序法? 顾名思 ...

  5. 浅谈Manacher算法与扩展KMP之间的联系

    首先,在谈到Manacher算法之前,我们先来看一个小问题:给定一个字符串S,求该字符串的最长回文子串的长度.对于该问题的求解,网上解法颇多,时间复杂度也不尽相同,这里列述几种常见的解法. 解法一   ...

  6. 快速排序 c++_算法浅谈——分治算法与归并、快速排序(附代码和动图演示)

    本文始发于个人公众号:TechFlow 在之前的文章当中,我们通过海盗分金币问题详细讲解了递归方法. 我们可以认为在递归的过程当中,我们通过函数自己调用自己,将大问题转化成了小问题,因此简化了编码以及 ...

  7. 浅谈HASH算法与CSDN密码泄漏事件

    在CSDN密码泄漏事件中,网友评论提到密码的明文保存和MD5保存问题.目前,很多站点都用MD5算法保存密码,但对于HASH(哈希)算法的认识还存在很多误区,很有必要重新认识. 一.HASH算法不是加密 ...

  8. 浅谈ICA算法的概念、本质和流程

    本文转自http://m.elecfans.com/article/699564.html ICA独立成分分析是近年来出现的一种强有力的数据分析工具(Hyvarinen A, Karhunen J, ...

  9. 排序中减治法算法伪代码_算法浅谈——分治算法与归并、快速排序(附代码和动图演示)...

    在之前的文章当中,我们通过海盗分金币问题详细讲解了递归方法. 我们可以认为在递归的过程当中,我们通过函数自己调用自己,将大问题转化成了小问题,因此简化了编码以及建模.今天这篇文章呢,就正式和大家聊一聊 ...

最新文章

  1. Delphi的彩蛋 (好像Delphi5~Delphi7都可以)
  2. python工作好找吗-python工作好找吗
  3. Python+Anaconda+PyCharm的安装和基本使用
  4. CCNA知识总结(一)
  5. 掌握JS压缩图片,这一篇就够了
  6. easyui datagrid加载本地数据和网络数据
  7. js语音识别_js 语音识别_js 语音识别库 - 云+社区 - 腾讯云
  8. linux中date命令y与Y区别,Linux命令之date
  9. Linux安装redis(6.0.9)环境
  10. linux运行Windows模拟器,如何安装和使用Wine,以便在Linux上运行Windows应用程序?...
  11. ROS2——通信接口(十)
  12. 请立刻行动,以免与津津乐道失联
  13. 感觉现在的技术圈越来越像娱乐圈了
  14. 鸿蒙系统一体机使用教程,华为视频会议系统TE30(华为新一体机)(示例代码)
  15. 寻找平面上的极大点(信息学奥赛一本通-T1230)
  16. 根据url 参数,页面显示不同背景图片
  17. 苹果cms v10影视网站数据采集
  18. 高三计算机教学计划,高三上学期教学教学计划集锦5篇
  19. Java招聘网站源码+页面
  20. 第十四周学习周报20181210-20181216

热门文章

  1. python读取txt文件并分割成列表_在python中读取文本文件并将其拆分为单个单词
  2. FastAdmin input digits不能输入小数 重写nice-validator插件的digits规则
  3. C:\Users\Admin\AppData\Roaming\npm-cache\_logs\2019-06-06T01_10_38_076Z-debug.log踩坑记
  4. 用小程序商城模板搭建商城【商城小程序】
  5. FPGA-4人表决器
  6. 数学建模美赛O奖论文研读启示录——从模仿开始
  7. 【彻底卸载mysql】卸载mysql 【亲测有效】
  8. python+openCV+pyqt5实现播放器
  9. cocosbuilder详细使用教程
  10. ABAP项目砖家之旅-基础篇