戳蓝字“CSDN云计算”关注我们哦!

技术头条:干货、简洁、多维全面。更多云计算精华知识尽在眼前,get要点、solve难题,统统不在话下!

—————  第二天  —————

小灰的思路如下:

第一步,利用迪杰斯特拉算法的距离表,求出从顶点A出发,到其他各个顶点的最短距离:

第二步,继续使用迪杰斯特拉算法,求出从顶点B出发,到其他各个顶点的最短距离。

第三步,从顶点C出发,到各个顶点的最短距离。

第四步,从顶点D出发......

.......

就像这样,一直遍历到顶点G。

这个思路的时间复杂度是多少呢?

假如图中有n个顶点,如果不考虑堆优化,一次迪杰斯特拉算法的时间复杂度是O(n^2)。所以,把每一个顶点都计算一遍,总的时间复杂度是O(n^3)。

————————————

举一个栗子:

上图的顶点A和顶点C没有直接相连的边,它们之间的直接距离是无穷大。

如果以B作为“中继顶点”,此时A到C的最短路径就是A-B-C,最短距离是3+2=5。

再举一个栗子:

上图的顶点A和顶点C直接相连,距离是6。但是存在一条“迂回”路径A-B-C,距离是3+2=5<6。

所以,经过中继顶点B,从A到C的最短距离可以是5。

下面我们来看一看Floyd算法的详细步骤。

1.要实现Floyd算法,首先需要构建带权图的邻接矩阵:

在邻接矩阵当中,每一个数字代表着从某个顶点到另一个顶点的直接距离,这个距离是没有涉及到任何中继顶点的。

2.此时假定只允许以顶点A作为中继顶点,那么各顶点之间的距离会变成什么样子呢?

B和C之间的距离原本是无穷大,此时以A为中继,距离缩短为AB距离+AC距离=

5+2=7。

更新对应矩阵元素(橙色区域代表顶点A到其他顶点的临时距离):

3.接下来以顶点A、B作为中继顶点,那么各顶点之间的距离会变成什么样子呢?

A和D之间的距离原本是无穷大,此时以B为中继,距离缩短为AB距离+BD距离=5+1=6。

A和E之间的距离原本是无穷大,此时以B为中继,距离缩短为AB距离+BE距离=5+6=11。

更新对应矩阵元素(橙色区域代表顶点B到其他顶点的临时距离):

4.接下来以顶点A、B、C作为中继顶点,那么各顶点之间的距离会变成什么样子呢?

A和F之间的距离原本是无穷大,此时以C为中继,距离缩短为AC距离+CF距离=2+8=10。

更新对应矩阵元素(橙色区域代表顶点C到其他顶点的临时距离):

.........

.........

以此类推,我们不断引入新的中继顶点,不断刷新矩阵中的临时距离。

最终,当所有顶点都可以作为中继顶点时,我们的距离矩阵更新如下:

此时,矩阵中每一个元素,都对应着某顶点到另一个顶点的最短距离。

为什么这么说呢?让我们回顾一下动态规划的两大要素:

问题的初始状态
问题的状态转移方程式

对于寻找图的所有顶点之间距离的问题,初始状态就是顶点之间的直接距离,也就是邻接矩阵。

而问题的状态转移方程式又是什么呢?

假设新引入的中继顶点是n,那么:

顶点i 到 顶点j 的新距离 = Min(顶点i 到 顶点j 的旧距离,顶点i 到 顶点n 的距离+顶点n 到 顶点j 的距离)

  1. final static int INF = Integer.MAX_VALUE;

  2. public static void floyd(int[][] matrix){

  3. //循环更新矩阵的值

  4. for(int k=0; k<matrix.length; k++){

  5. for(int i=0; i<matrix.length; i++){

  6. for(int j=0; j<matrix.length; j++){

  7. if(matrix[i][k] == INF || matrix[k][j] == INF) {

  8. continue;

  9. }

  10. matrix[i][j] = Math.min(matrix[i][j], matrix[i][k] + matrix[k][j]);

  11. }

  12. }

  13. }

  14. // 打印floyd最短路径的结果

  15. System.out.printf("最短路径矩阵: \n");

  16. for (int i = 0; i < matrix.length; i++) {

  17. for (int j = 0; j < matrix.length; j++)

  18. System.out.printf("%3d ", matrix[i][j]);

  19. System.out.printf("\n");

  20. }

  21. }

  1. public static void main(String[] args) {

  2. int[][] matrix = {

  3. {0, 5, 2, INF, INF, INF, INF},

  4. {5, 0, INF, 1, 6, INF, INF},

  5. {2, INF, 0, 6, INF, 8, INF},

  6. {INF, 1, 6, 0, 1, 2, INF},

  7. {INF, 6, INF, 1, 0, INF, 7},

  8. {INF, INF, 8, 2, INF, 0, 3},

  9. {INF, INF, INF, INF, 7, 3, 0}

  10. };

  11. floyd(matrix);

  12. }

福利

扫描添加小编微信,备注“姓名+公司职位”,加入【云计算学习交流群】,和志同道合的朋友们共同打卡学习!

推荐阅读:

  • 太形象了!什么是边缘计算?最有趣的解释没有之一!

  • 互联网出海十年

  • 华为员工年薪 200 万!真相让人心酸!

  • 天才程序员:25 岁进贝尔实验室,32 岁创建信息论  琥珀  极客宝宝  5天前

  • 安全顾问反水成黑客, 靠瞎猜盗得5000万美元的以太币, 一个区块链大盗的另类传奇

  • 人造器官新突破!美国科学家3D打印出会“呼吸”的肺 | Science

真香,朕在看了!

漫画:图的 “多源” 最短路径相关推荐

  1. 图的单源最短路径:Dijkstra算法实现

    本文介绍的是图的非负权值的单源最短路径问题.问题的提出是,对于有权图D,t提供源点v,要找到从v到其他所有点的最短路径,即单源最短路径问题,在本文中,解决这一问题,是普遍比较熟悉的Dijkstra算法 ...

  2. 图的单源最短路径(Dijkstra算法)

    单源最短路径问题 如果从图中某一顶点(源点)到达另一顶点(终点)的路径可能不止一条,如何找到一条路径使得沿此路径各边上的权值总和达到最小. Dijkstra算法由来 迪杰斯特拉算法(Dijkstra) ...

  3. 无权图的单源最短路径

    就像日常生活中的搭地铁问题,有的人会选择到达目的地最短距离的路线,有的人会选择地铁换乘次数最少的路线,其目的都是为了尽快到达目的地.选择到达目的地距离最短的路线,可以把两结点边的权值看成距离,而选择换 ...

  4. 图的单源最短路径算法

    第1关:求图(邻接矩阵存储)最短路径的狄克斯特拉算法 任务描述 本关任务:图的存储结构为邻接矩阵,要求编写函数实现狄克斯特拉算法. 测试说明 平台会对你编写的代码进行测试: 测试输入: 1 lt4.t ...

  5. 图的单源最短路径,Floyd算法(数据结构c++)

    这个算法结构很是简单,但是理解还是有一定的困难,一开始做的时候想不明白,跟着算法自己动手画画就知道这个算法具体是怎么回事了. 时间复杂度是O(N*3) 算法有点动态规划的意思,有两个数组,一个(dis ...

  6. BFS求无权图的单源最短路径-邻接矩阵存储

    //邻接矩阵存储 void BFS_MIN-Distance(Graph G,int u){//d[i]表从u到i的最短路径for(i=0;i<G.vexnum;i++)d[i]=INT_MAX ...

  7. 【2023王道数据结构】【图】通过C++实现图的BFS(广度优先遍历)算法求单源最短路径问题C、C++完整实现(可直接运行)

    ~~~笔锋至此又怎能平淡而终,故事开始便不承认普通✌✌✌ ✌ 题目及题解持续更新中 [2023王道数据结构目录]课后算法设计题C.C++代码实现完整版大全 题目: 通过C++实现图的BFS(广度优先遍 ...

  8. 单源最短路径bellman算法

    介绍 在一个权重,有向图G=(V,E)中,连接所有顶点且拥有最小权重值的路径是此图的单源最短路径.单源最短路径可以解决许多最短路径问题的变种:如一个顶点到其它所有顶点最短距离,2个顶点对之间的最短距离 ...

  9. 四种不同单源最短路径算法性能比较

    四种不同单源最短路径算法性能比较   一.最短路径问题描述 单源最短路径描述:给定带权有向图G=(V,E),其中每条边的权是非负实数.另外,还给定V中的一个顶点,称之为源.现在要计算从源到其他各顶点的 ...

最新文章

  1. 如何营造专属你的企业技术影响力氛围感?我不允许你还不知道
  2. Docker(十一):Docker实战 安装 PHP 5.6、7
  3. 手机突然电量消耗很快_手机突然出现这些故障!我来教你快速解决!
  4. 生产问题:一个线程罢工的诡异事件
  5. 阿里云ubuntu mysql_Ubuntu下安装MySQL(阿里云服务器)
  6. Java命名规范(建议收藏)
  7. 47 - 算法 - Leetcode-160 -相交链表
  8. 《计算机网络》简要学习笔记:未完自用
  9. 对数—行列式函数的分析
  10. css背景和边框标签总结
  11. 基于SpringBoot的统计报表后台管理系统
  12. springboot+cxf框架 WebService
  13. Badboy工具:简介,安装,脚本录制
  14. Flash入门:动画制作基础知识
  15. SQL 2008客户端ODBC配置DSN时使用网络登录ID的windows NT验证登录时 报18452错误
  16. 我的世界服务器怎么修改名称,我的世界端游怎么改名字
  17. 微信小程序码接口返回的二进制内容处理返回给前端展示
  18. java PDF 生成方案
  19. mit2021计算机竞赛女生,2021全国大学生计算机系统能力大赛操作系统设计赛第一场研讨会隆重举行...
  20. 瞬渺光电代理THZ光谱仪成功客户

热门文章

  1. LinuX编译显示内核配置无效,配置编译内核(Linux kernel)
  2. mysql cmd 实时监控_MySQL实时监控工具orztop的使用介绍
  3. vscode导入本地jar包_go导入本地包踩坑(已解决!)
  4. 2021软科世界大学学术排名发布!
  5. 95后女孩成最年轻“航天人”,团队里女孩占一半,老一辈退休年轻人挑大梁啦...
  6. 世界上最长的博士论文,列入吉尼斯世界纪录
  7. 我们是否能信任算法?不信任又能怎么办?
  8. 唐人街神探:用数学方法确定罪犯位置
  9. linux内核优化策略,linux系统调优小结
  10. Pycharm 2019 添加 docker 解释器