Floyd不同于Dijkstra,可以得到所有点对的最短路径。使用的是DP

Floyd可以处理有负权重边的情况

递推公式:w(i, j) = min{w(i, j), w(i, k) + w(k, j)},含义是【i到j的最短距离】=【i到k的最短距离+k到j的最短距离】与【i到j的最短距离】中较小的那一个

看起来很简单,但是具体怎么计算呢?

依旧使用这个例子,图的表示方式为:

[[0, 7, 9,  max,  max, 14],[7, 0, 10, 15, max, max],[9, 10, 0, 11, max, 2],[max, 15, 11, 0, 6, max],[max, max,  max,  6, 0, 9],[14,max,  2,  max, 9, 0]]

可以看出,w(i, i) = 0。这就是突破口了。

当k=0时,w(0, j)=min{w(0,0)+w(0,j), w(0,j)};w(i,0)=min{w(i,0)+w(0,0), w(i,0)},是不用更新的。当然,k不为0的时候,需要更新w(0,j)和w(i,0)

类似的,可以得到w(k,j)和w(i,k)不用更新。也就是说,和k相同行、列不用更新

用图做个例子:求图中蓝色的值w(4,2)

w(4,2) = min{w(4,2) + 红色两个格子的和+绿色两个格子的和+紫色两个格子的和+薄荷色两个格子的和}

1. 可以看出k=2和k=4的时候,更新时没有意义的。

2. 可以看出,计算过程其实就是画一个(k,k)-(4,2)的方框,比较w(4,2)和方框的另外两个顶点w(4,k)+w(k,2)的大小。当然,这个时候w(4,k)和w(k,2)应该也是最优的解。

所以明显不能以i,j,k的loop顺序遍历。

那么试一下以k,i,j的loop顺序遍历呢?

这里有个很取巧的点:

1. 当k=0的时候,第一行、第一列已经是k=0的最优解了(还记得前面的结论吗)

2. 当k=0的时候,其他的行、列只用取第一行、第一列的数据

也就是说,当k=0的时候,遍历完整张图,能得到k=0的情况下dp算法的最优解:当且仅当中间节点编号<=0的时候,点i到点j的最近值

继续证明k=x的情况下最优解已经得到,k=x+1时继续遍历,能否得到k=x+1的最优解?

1. k=x+1的时候,第x+1行、第x+1列已经是k<=x+1的最优解了(k=x+1时,不用更新第x行、第x列)

2. k=x+1的时候,其他的行、列只会读取第x+1行、第x+1列的数据

因此当k=x+1时,遍历完整张图,能得到k=x+1的情况下dp算法的最优解

证明完毕

以上的证明过程也就是“十字交叉算法”的原理了。

感兴趣的同学可以网上搜一下,瞬间即懂

def floyd(graph):# graph:n*n matrix# find min distance from start_node to end_nodelength = len(graph)for k in xrange(0, length):for i in xrange(0, length):for j in xrange(0, length):graph[i][j] = min(graph[i][k] + graph[k][j], graph[i][j])return graph

时间复杂度O(n^3)

驱动

graph = [[0, 7, 9,  max_int,  max_int, 14],[7, 0, 10, 15, max_int, max_int],[9, 10, 0, 11, max_int, 2],[max_int, 15, 11, 0, 6, max_int],[max_int, max_int,  max_int,  6, 0, 9],[14, max_int,  2,  max_int, 9, 0]]
print floyd(graph)

附录:

打印出最短路径

def floyd(graph):# graph:n*n matrix# find min distance from start_node to end_nodelength = len(graph)pre_node = [[-1 for i in xrange(0, length)] for j in xrange(0, length)]for k in xrange(0, length):for i in xrange(0, length):for j in xrange(0, length):dist = graph[i][k] + graph[k][j]if dist < graph[i][j]:graph[i][j] = distpre_node[i][j] = kprint "pre_node", pre_nodereturn graph

最短路径算法----Floyd-warshall(十字交叉算法证明)相关推荐

  1. Floyd - Warshall(弗洛伊德算法)

    简介:Floyd算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似.该算法名称以创始人之一.1978年图灵奖获得者.斯坦福大学计算机科学系 ...

  2. C++floyd warshall算法求最短路径(附完整源码)

    C++floyd warshall算法求最短路径 floyd warshall算法求最短路径的完整源码(定义,实现,main函数测试) floyd warshall算法求最短路径的完整源码(定义,实现 ...

  3. Floyd Warshall算法

    Description: 描述: This is a very popular interview problem to find all pair shortest paths in any gra ...

  4. 计算完全最短路径的Floyd算法

    [计算完全最短路径的Floyd算法] (一).定义** Floyd–Warshall(简称Floyd算法)是一种著名的解决任意两点间的最短路径(All Paris Shortest Paths,APS ...

  5. 最短路径算法——迪杰克斯拉算法/floyd算法

    最短路径算法--迪杰克斯拉算法 Dijkstra算法的思想 1.设置两个顶点集S和T,集合S中存放已经找到最短路径的顶点,集合T中存放着当前还未找到最短路径的顶点: 2.初始状态下,集合S中只包含源点 ...

  6. 短小精悍的多源最短路径算法—Floyd算法

    前言 在图论中,在寻路最短路径中除了Dijkstra算法以外,还有Floyd算法也是非常经典,然而两种算法还是有区别的,Floyd主要计算多源最短路径. 在单源正权值最短路径,我们会用Dijkstra ...

  7. 两种最短路径(测地距离)的算法——Dijkstra和Floyd

    从某顶点出发,沿图的边到达另一顶点所经过的路径中,各边上权值之和最小的一条路径叫做最短路径.解决最短路的问题有以下算法,Dijkstra算法,Bellman-Ford算法,Floyd算法和SPFA算法 ...

  8. 图的所有顶点间的最短路径(Floyd算法)

    问题描述 对每一对顶点vi ≠ vj,求出vi与vj之间的最短路径和最短路径长度 Floyd算法 Floyd(Floyd-Warshall)算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中 ...

  9. 关于Floyd-Warshall算法由前趋矩阵计算出的最短路径反映出了算法的执行过程特性的证明...

    引言:Floyd-Warshall算法作为经典的动态规划算法,能够在O(n3)复杂度之内计算出所有点对之间的最短路径,且由于其常数较小,对于中等规模数据运行效率依然可观.算法共使用n此迭代,n为顶点个 ...

  10. 浅谈最短路径O(n^3)万(蒟)能(蒻)算法——————Floyd《最短路径·O(n^3)Floyd篇》

    浅谈 最短路径O(n^3)万(蒟)能(蒻)算法------Floyd <最短路径·O(n^3)Floyd篇> 暑假,小哼准备去一些城市旅游.有些城市之间有公路,有些城市之间则没有,如下图. ...

最新文章

  1. mysql 上亿记录_一入职!就遇到上亿(MySQL)大表的优化....
  2. 用离散傅里叶变换来实现OFDM
  3. vee-validate校验demo
  4. 四招避免SEO优化过度
  5. 玩转Google开源C++单元测试框架Google Test系列(gtest)之一 - 初识gtest
  6. Effective Java之用实例域代替序数(三十一)
  7. Recyclerview不显示内容
  8. OAuth 2.0 扩展协议之 PKCE
  9. .Net 如何模拟会话级别的信号量,对http接口调用频率进行限制(有demo)
  10. python每行输出14个数_python – 计算pandas中每行的一些值的列数
  11. 李宏毅机器学习(七)Bert and its family
  12. 《计算机网络》第二章:物理层(The Physical Layer)
  13. 什么样的项目适合自动化测试
  14. Python打地鼠小游戏源代码
  15. 软考——论文写作基本介绍
  16. 树莓派安装wps2019教程
  17. 【CLion】新手使用之编译运行单个文件
  18. 7个少有人知的资源宝藏网站,浏览器瞬间爆棚!速速收藏
  19. windows 搜索文件内容 txt 、excel 、word、c、java 、压缩文件 等文件内容
  20. 计算在一起的天数html,记录情侣在一起天数的软件 很火的情侣天数记录软件

热门文章

  1. 甩开炎热去15℃的四川秘境度假,这里有藏于田园风景的纯白民宿
  2. 大厂技术博客学习(2)​——5G时代下淘宝直播高清低延时技术jie秘
  3. u盘中的android文件夹图标不显示,怎么解决u盘图标变成文件夹,手把手教你解决方法...
  4. serverlet增删改查项目代码
  5. sugon服务器型号从哪看,sugon服务器初始密码
  6. 【设计】资料合集(1-121)副业学习会
  7. Category底层原理实现
  8. ubuntu16.04/20.04 xfce4以及windows下面使用护眼软件redshift
  9. 深入理解 ZK 中的 “大多数” 机制
  10. linux开机自动执行脚本、运行程序