Johnson算法学习笔记
\(Johnson\)算法学习笔记。
在最短路的学习中,我们曾学习了三种最短路的算法,\(Bellman-Ford\)算法及其队列优化\(SPFA\)算法,\(Dijkstra\)算法。这些算法可以快速的求出单源最短路,即一个源点的最短路.
而\(Floyd\)算法,这个及其简短的算法,可以以\(O(n^3)\)的复杂度算出任意一对点之间的最短路。
我们发现,\(floyd\)算法的时间复杂度和边的数量没有多大的关系,也就是说,\(floyd\)使用的最优条件是稠密图。
那么问题来了,如果我们面对一个点数非常多但是边数较少的图,我们该用什么算法呢?
\(johnson\)出现了。
\(johnson\)算法是一类用来处理多源最短路的算法,它的复杂度是\(O(n*m*log_n)\)。
简单的来说,\(johnson\)算法是糅合的两大单源最短路算法的算法。
\(dijkstra\)算法在算法界是一个公认非常好用的算法,只可惜其限制条件过多,必须没用负边才可以使用。
而\(SPFA\)就没有那么多限制了,它只用保证数据中不会出现负环即可,可是由于\(spfa\)算法及其不稳定,及其容易被卡成\(O(n*m)\)的复杂度。
\(johnson\)算法就利用了两大算法的优点。
首先\(johnson\)先利用\(SPFA\)将所有的边处理一下,将负边权全都转成正边权。
然后再每个点暴力跑\(dijkatra\)求出最短路。
第二步利用\(dijkstra\)跑最短路是十分显然好懂的,问题就是第一步将负边改为正边。
我们知道,直接将所有的负边加上一个极大值是错误的,我们要给所有的边加上一个合适的值。
那么这个值是什么呢?
我们先增加一个超级源,把所有点和它相连即可。
然后,我们来以超级源为源点跑一遍\(spfa\)。
然后我们对于每一条边加上\(spaf\)跑完后的\(dis[0][u]-dis[0][v]\)。
最后,把所有的\(dis[u][v]\)减去\(dis[0][u]-dis[u][v]\)还原。
让我们来证明其正确性:
1.边权不为负数。
由于\(dis[0][u]+w(u,v)>=dis[0][j]\);
所以必有\(dis[0][u]-dis[0][j]+w(u,v)>=0\)。
所以边权必定大于等于\(0\),可以用\(dijkstra\)跑。
2.还原的正确性。
我们有一条集合为\(\{A_1,A_2,A_3,,,,A_p\}\)的最短路。
我们对边权进行修改后,最短路改变的值为:\(dis[0][A_1]-dis[0][A_2]+dis[0][A_2]-...-dis[0][A_p]\)。
即:\(dis[0][A_1]-dis[0][A_p]\)。
所以,当我们修改一些权值时,任意两点之间的最短路改变的值是一个定值,即\(dis[0][u]-dis[v]\),
在最后的\(dis[u][v]\)上减掉即可。
Johnson算法学习笔记的更多相关文章
- Johnson 全源最短路径算法学习笔记
Johnson 全源最短路径算法学习笔记 如果你希望得到带互动的极简文字体验,请点这里 我们来学习johnson Johnson 算法是一种在边加权有向图中找到所有顶点对之间最短路径的方法.它允许一些 ...
- C / C++算法学习笔记(8)-SHELL排序
原始地址:C / C++算法学习笔记(8)-SHELL排序 基本思想 先取一个小于n的整数d1作为第一个增量(gap),把文件的全部记录分成d1个组.所有距离为dl的倍数的记录放在同一个组中.先在各组 ...
- Manacher算法学习笔记 | LeetCode#5
Manacher算法学习笔记 DECLARATION 引用来源:https://www.cnblogs.com/grandyang/p/4475985.html CONTENT 用途:寻找一个字符串的 ...
- 某科学的PID算法学习笔记
最近,在某社团的要求下,自学了PID算法.学完后,深切地感受到PID算法之强大.PID算法应用广泛,比如加热器.平衡车.无人机等等,是自动控制理论中比较容易理解但十分重要的算法. 下面是博主学习过程中 ...
- 算法学习笔记——sort 和 qsort 提供的快速排序
这里存放的是笔者在学习算法和数据结构时相关的学习笔记,记录了笔者通过网络和书籍资料中学习到的知识点和技巧,在供自己学习和反思的同时为有需要的人提供一定的思路和帮助. 从排序开始 基本的排序算法包括冒泡 ...
- R语言实现关联规则与推荐算法(学习笔记)
R语言实现关联规则 笔者前言:以前在网上遇到很多很好的关联规则的案例,最近看到一个更好的,于是便学习一下,写个学习笔记. 1 1 0 0 2 1 1 0 0 3 1 1 0 1 4 0 0 0 0 5 ...
- 二次剩余Cipolla算法学习笔记
对于同余式 \[x^2 \equiv n \pmod p\] 若对于给定的\(n, P\),存在\(x\)满足上面的式子,则乘\(n\)在模\(p\)意义下是二次剩余,否则为非二次剩余 我们需要计算的 ...
- SPFA算法学习笔记
一.理论准备 为了学习网络流,先水一道spfa. SPFA算法是1994年西南交通大学段凡丁提出,只要最短路径存在,SPFA算法必定能求出最小值,SPFA对Bellman-Ford算法优化的关键之处在 ...
- 算法学习笔记(三) 最短路 Dijkstra 和 Floyd 算法
图论中一个经典问题就是求最短路.最为基础和最为经典的算法莫过于 Dijkstra 和 Floyd 算法,一个是贪心算法,一个是动态规划.这也是算法中的两大经典代表.用一个简单图在纸上一步一步演算,也是 ...
随机推荐
- B/S文件上传下载解决方案
需求: 项目要支持大文件上传功能,经过讨论,初步将文件上传大小控制在20G内,因此自己需要在项目中进行文件上传部分的调整和配置,自己将大小都以20G来进行限制. PC端全平台支持,要求支持Window ...
- LOJ #6145. 「2017 山东三轮集训 Day7」Easy 点分树+线段树
这个就比较简单了~ Code: #include <cstdio> #include <algorithm> #define N 100004 #define inf 1000 ...
- 51 Nod 1020 逆序排列
1020 逆序排列 基准时间限制:2 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 收藏 关注 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么 ...
- UVA 11178 Morley's Theorem 计算几何模板
题意:训练指南259页 #include <iostream> #include <cstdio> #include <cstring> #include < ...
- Remove the Substring
D2. Remove the Substring (hard version) 思路:其实就是贪心吧,先从前往后找,找到 t 可在 s 中存在的最小位置 (pre),再从后往前找,找到 t 可在 s ...
- windows 安装使用 Memcached
Windows无官方版本:下载地址http://static.runoob.com/download/memcached-win64-1.4.4-14.zip 安装: 1.解压下载的压缩包2.命令行模 ...
- C++入门经典-例4.5-利用循环求n的阶乘
1:代码如下: // 4.5.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> using ...
- Java多线程核心知识
多线程相对于其他 Java 知识点来讲,有一定的学习门槛,并且了解起来比较费劲.在平时工作中如若使用不当会出现数据错乱.执行效率低(还不如单线程去运行)或者死锁程序挂掉等等问题,所以掌握了解多线程至关 ...
- 关于MySQL中查询结果的count和from后的条件与where后的条件对比
啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦 ...
- php 发送邮件(2)qq邮箱开通
一 首选登录qq邮箱,在最上面那里找到设置,点击打开 二 下拉,找到账号安全和它下面的内容 ,开启服务 imap/smtp