首页 > 编程语言 >五种基础的最短路算法总结与证明

五种基础的最短路算法总结与证明

时间:2022-09-18 22:00:20浏览次数:96  
标签:松弛 dist 经过 短路 路径 算法 五种 操作 节点

  1. 朴素版dijkstra : 进行 n-1 次松弛操作, 每次都用当前 dist 最小的点更新, 这样就能保证经过了 n-1 次松弛之后, 起点到其他点的距离一定是最短的 (On^2)

  2. 堆优化版dijkstra : 每次都堆顶取出元素(确保了它是当前 dist 最小的点), 然后遍历该点的所有邻边, 当所有的点都进行了松弛操作过后, 一定能够得到最短距离 (Omlogn, 因为每个点遍历的是周围的邻边)

  3. bellman-ford : 进行 k 次松弛操作, 每次松弛操作都遍历整张图, 因此效率很低, 时间复杂度为 (nm). k 次松弛操作的实际含义是 起点到其他点在经过不超过 k 条边的最短距离 (因此需要 backup数组, 防止有串联的情况发生)

  4. spfa : 每个点能够进行多次松弛操作的 dijkstra 算法, 这也是能够处理负权边的原因, 只要该点的 dist 发生了变化, 那么就将它加入队列中, 等待进行松弛操作, 这也是比 bellman-ford 快的原因, bellman 是让所有的点都进行一次松弛操作, 但是 spfa 只会在 dist 改变后才进行松弛操作 ⇒ 确保了每次都是在做有用功, 这也有关于它 dist 数组的定义 (该点是否已经在队列中), 由于该算法会在点出队列之后将它的标记置为 false , 因此如果让一个点重复入队的话, 那么它之后进行的松弛操作大部分都是无用功!!!

  5. floyd : 基于动态规划. 证明: f[k][i][j] 表示 经过若干个不超过 编号为 k 的节点, 从 ij 的最短路的长度, 这样就能够求出 1~k 的节点中所有节点两两之间的最短路径了. 该状态集合能够划分为两种情况 : 1. i → j 的路径上不经过 k . 2. i → j 的路径上经过节点 k. 因此就会有两个集合 ( 1. i → j 其中所有经过的节点不超过 k-1, 因为它不经过 k. 2. i → k → j , 可以发现 i → k 和 k → j 这两个集合是互不影响的, 因此前面的路径为 f[k-1][i][k], 后面的路径为 f[k-1][k][j] ) . 因此就能够进行状态的转移 ⇒ f[k][i][j] = min(f[k-1][i][k] + f[k-1][k][j], f[k-1][i][j]) , 再优化掉第一维, 状态转移就变成了 f[i][j] = min(f[i][k] + f[k][j], f[i][j]) . 其中它的初始为 f[0][i][j] = g[i][j] , 因为 i→j 不会经过其他任何的点, 所以可以直接在 g 数组之上直接进行状态计算. 最终所有的 i → j 都能得到最短距离 (中间路径经过若干点, 且节点编号不超过 n 的最短距离)

标签:松弛,dist,经过,短路,路径,算法,五种,操作,节点
From: https://www.cnblogs.com/Kurisu-Makise/p/16705964.html

相关文章

  • 串的模式匹配算法
    一、算法设计思想1.简单模式匹配算法从主串的第一个位置开始和模式串的第一个字符开始比较,相等继续比较下一个字符;否则从主串的下一个字符和模式串的第一个字符重新开始......
  • C语言短路与短路或
    在C语言中短路与&&短路或||在进行#include<stdio.h>intmain(){ inta=1,b=2,c=3,d=4,m=2,n=2; //在这里如果m=a>b第一个表达式结果为1就是true,第二个表达式......
  • k最近邻算法
    #K最近邻算法##概述K最近邻算法适用于找出距离A坐标最近的几个点,可以用来做推荐系统##计算公式以及模拟K最近邻算法有两个公式:距离公式,相似度公式(余弦)###距离公式......
  • 平滑的加权轮询均衡算法
    前言在反向代理、路由、分布式应用调度等场景中通常都需要用到负载均衡算法,负载均衡的关键要点是“均衡”,即确保调用请求能均衡的落到多个处理节点上,负载均衡算法一般使用......
  • 算法性能分析
    算法的性能分析概括成时间复杂度和空间复杂度两部分;1.时间复杂度通常指算法运行的时间(大O记法只保留最高次项,忽略低次项和常数项)2.空间复杂度......
  • KMP算法的底层理解
    KMP的主要思想是当出现字符串不匹配时,可以知道一部分之前已经匹配的文本内容,可以利用这些信息避免从头再去做匹配了。KMP的精髓所在就是前缀表。(下面用next[]数组来表......
  • 通关基本算法 day_03 -- 二分算法
    整数二分本质如果有单调性的话-->我可以二分,反之不然整个区间可以一分为二,我们定义了一个性质,右半边是满足这个性质的,但是左半边不满足二分可以寻找这个性质的边界......
  • AcWing 算法提高课 强连通分量
    1、Tarjan算法求强连通分量: 强连通分量的点可能会向上联通。  维护两个时间戳。 ......
  • G1GC的算法与实现 pdf
    高清扫描版下载链接:https://pan.baidu.com/s/1GO-QAbmrsxH3Qvns1JATyA点击这里获取提取码 ......
  • 算法竞赛进阶指南 0x22 深度优先搜索
    AcWing165.小猫爬山翰翰和达达饲养了N只小猫,这天,小猫们要去爬山。经历了千辛万苦,小猫们终于爬上了山顶,但是疲倦的它们再也不想徒步走下山了(呜咕>_<)。翰翰和达达只好......