首页 > 编程语言 >【图论】Johnson全源最短路算法

【图论】Johnson全源最短路算法

时间:2024-09-11 21:25:32浏览次数:1  
标签:图论 Johnson 短路 Bellman 算法 全源 qwq

·2024-9-11 ·最后更新时间 2024-9-11

作者学会了一个叫做\(Johnson\)的算法,所以就有了这篇博客......
Johnson算法是一个高效处理全源最短路的算法 其实也很慢,但目前是最高效的 为了更加方便你们接下来的学习我希望你们已经掌握了基本的最短路算法(SPFA,Dijsktra,Bellman-Ford,Floyd)如果没有掌握建先去学习一下qwq,

1.算法思路

我们知道通过Bellman-Ford我们可以在 \(O(n^2m)\) 的时间复杂度内求出两点之间的最短路,也可以通过类似动态规划的Floyd在 \(O(n^3)\) 的时间复杂度内求出两点最短路径,但是我们可以发现如果我们对于每个点跑一次 堆优化 Dijkstra最后的时间复杂度是 \(O(n*mlogn)\) 这是比Bellman-Ford算法要快的!!!但是,Dijkstra处理不了负边权啊,"那我们可以给所有边加上一个数字让他变成正数啊qwq" 什么时候蹿出来的 这个可能是大部分人第一时间的想法,但是并不如此,比如这样一个图:

\(1->2\) 的最短路显然是 \(1->5->3->2\) 为 \(-2\)
但是当我们给所有边的边权都加上 \(5\) 最短路就变成了 \(1->4->2\) 这并不是我们想要的结果QAQ
那么有什么办法可以使得最后的最短路大小不变呢?
我们可以设一个超级源点并向其他所有点连一个长度为 \(0\) 的边:

然后求出所有点到 \(0\) 的最短路:

我们设最短路答案为 \(h_i\) 然后对于每条边我们让 \(w+h_i-h_j\) 就好啦qwq

标签:图论,Johnson,短路,Bellman,算法,全源,qwq
From: https://www.cnblogs.com/chenzhekeai/p/18409005

相关文章

  • 第十一章 图论 Part7
    目录最小生成树算法prim算法适用范围:无向图思路kruskal算法适用范围:无向图思路最小生成树算法prim算法适用范围:无向图思路以将所有点归入最小生成树为目标,每次并入一个,最终生成最小生成树。每次并入的步骤:确定选哪个节点并入(不在最小生成树里的,距离最小生成树(已并入的......
  • 代码随想录day 56 || 图论6
    Prim算法应用场景是主要是找到一个无向连通图的最小生成树,即连接所有节点且权重总和最小的树//prim三部曲//1,找到距离当前最小树最近节点//2,节点入树//3,更新mindist//更新树funcupdateMinDist(edges[][]int,nodeint){ for_,edge:=rangeedges{ ifed......
  • 代码随想录day55 || 图论5
    并查集197图中是否存在有效路径varfather[]intfuncvalidPath(nint,edges[][]int,sourceint,destinationint)bool{ //使用并查集算法,涉及到的操作,包括init,find,issample,join father=make([]int,n) fori,_:=rangefather{//init father[i]=i }......
  • 代码随想录训练营 Day53打卡 图论part04 110. 字符串接龙 105. 有向图的完全可达性 10
    代码随想录训练营Day53打卡图论part04一、卡码110.字符串接龙本题与力扣127题是一样的,所以这里使用力扣127题。字典wordList中从单词beginWord到endWord的转换序列是一个按下述规格形成的序列beginWord->s1->s2->…->sk:    每一对相邻的单词只......
  • 图论篇--代码随想录算法训练营第五十三天打卡| 110. 字符串接龙,105.有向图的完全可达
    110.字符串接龙题目链接:110.字符串接龙题目描述:字典strList中从字符串beginStr和endStr的转换序列是一个按下述规格形成的序列: 序列中第一个字符串是beginStr。序列中最后一个字符串是endStr。 每次转换只能改变一个字符。 转换过程中的中间字符串必须是字典......
  • 第十一章 图论 Part4
    目录任务127.单词接龙思路Kama105.有向图的完全可达性思路463.岛屿的周长思路任务127.单词接龙字典wordList中从单词beginWord到endWord的转换序列是一个按下述规格形成的序列beginWord->s1->s2->...->sk:每一对相邻的单词只差一个字母。对于1<=i<=......
  • 图论板子
    Primtypedefpair<int,int>P;intprim(){intans=0,cnt=0;priority_queue<P,vector<P>,greater<P>>q;fill(d+1,d+n+1,INF);d[1]=0;q.push(P(d[1],1));while(!q.empty()&&cnt<......
  • 代码随想录day 53 || 图论4
    字符串接龙varqueue*list.ListvarvisitMapmap[string]boolfuncmain(){ varcountint fmt.Scanf("%d",&count) varstartStr,endStrstring fmt.Scanf("%s%s",&startStr,&endStr) varstrList=make([]string,count) fo......
  • 第十二章 图论 Part3
    目录任务Kama101.孤岛的总面积思路Kama102.沉没孤岛思路Kama103.水流问题思路Kama104.建造最大岛屿思路心得任务Kama101.孤岛的总面积给定一个由1(陆地)和0(水)组成的矩阵,岛屿指的是由水平或垂直方向上相邻的陆地单元格组成的区域,且完全被水域单元格包围。孤岛是那些位于矩......
  • 代码随想录day52 || 图论3
    岛屿最大的孤岛面积packagemainimport"fmt"vardirPath=[4][2]int{{0,-1},{1,0},{0,1},{-1,0}}varvisited[][]boolvarflagboolvarresintfuncmain(){ varx,yint fmt.Scanf("%d%d",&x,&y) //x行y列初始化临界矩阵 vargra......