前言

由于本人太菜,这里不讨论Floyd的正确性。

简介

多源最短路径,解决的是求从图中任意两点之间的最短路径的问题。

分析

代码短小精悍,主要代码只有四行,直接放上:

for(int k=1;k<=n;++k)
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);

接下来一步一步分析这个算法。

其实这个算法并不难,首先要知道,dis[i][j]表示的是从点i到点j的最短路径的长度。

仔细看这个语句:dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);

其实,可以再将它放大,变成这样:

if(dis[i][k]+dis[k][j]<dis[i][j])
dis[i][j]=dis[i][k]+dis[k][j];

这个意思就是说,如果从点i到点k的最短路径长度加上点k到点j的最短路径长度比原来点i到点j的最短路径长度短,就把原来i->j的最短路径更新。

你可能会说:

诶你这不是i->k->j和i->j作比较吗,如果i->a->b->j比i->k->j更短呢?

这时候,就要回顾一下我们的dis数组的含义了。dis[i][j]只表示点i到点j的最短路径的长度,并不是i->j的路径的长度。也就是说,我们不关心是怎么从i走到j的(可能是i->a->b->j,也可能是i->c->j),但是我们只想知道从i到j最短需要走多长,其实这就是dp(动态规划)的想法了。

你可能会说:

如果到不了呢??那还怎么算?

这就涉及到初始化的问题了。

由于是最短路径问题,所以如果到不了,我们可以将dis[i][j]的值设为inf(无穷大)。

如果能从节点i直接走到节点j(这里是直接走到,就是i,j有一条边相连),就可以把dis[i][j]设为这条边的权值。

在重新回顾一下Floyd的三重循环:

for(int k=1;k<=n;++k)
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
//...

其实这个k,就是我们不断枚举的中转点。如果从i到j经过中转点k会更短,就可以更新。

时间复杂度显而易见:\(O(n^3)\)。

多源最短路径算法:Floyd算法的更多相关文章

  1. 数据结构与算法--最短路径之Floyd算法

    数据结构与算法--最短路径之Floyd算法 我们知道Dijkstra算法只能解决单源最短路径问题,且要求边上的权重都是非负的.有没有办法解决任意起点到任意顶点的最短路径问题呢?如果用Dijkstra算 ...

  2. 最短路径---Dijkstra/Floyd算法

    1.Dijkstra算法基础: 算法过程比prim算法稍微多一点步骤,但思想确实巧妙也是贪心,目的是求某个源点到目的点的最短距离,总的来说dijkstra也就是求某个源点到目的点的最短路,求解的过程也 ...

  3. 单源最短路径(dijkstra算法)php实现

    做一个医学项目,当中在病例评分时会用到单源最短路径的算法.单源最短路径的dijkstra算法的思路例如以下: 如果存在一条从i到j的最短路径(Vi.....Vk,Vj),Vk是Vj前面的一顶点.那么( ...

  4. 多源最短路径算法—Floyd算法

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

  5. 最短路径问题——floyd算法

    floyd算法和之前讲的bellman算法.dijkstra算法最大的不同在于它所处理的终于不再是单源问题了,floyd可以解决任何点到点之间的最短路径问题,个人觉得floyd是最简单最好用的一种算法 ...

  6. [链接]最短路径的几种算法[迪杰斯特拉算法][Floyd算法]

    最短路径—Dijkstra算法和Floyd算法 http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html Dijkstra算 ...

  7. 图的最短路径---弗洛伊德(Floyd)算法浅析

    算法介绍 和Dijkstra算法一样,Floyd算法也是为了解决寻找给定的加权图中顶点间最短路径的算法.不同的是,Floyd可以用来解决"多源最短路径"的问题. 算法思路 算法需要 ...

  8. 多源最短路——Floyd算法

    Floyd算法 问题的提出:已知一个有向网(或者无向网),对每一对定点vi!=vj,要求求出vi与vj之间的最短路径和最短路径的长度. 解决该问题有以下两种方法: (1)轮流以每一个定点为源点,重复执 ...

  9. 0016:单源最短路径(dijkstra算法)

    题目链接:https://www.luogu.com.cn/problem/P4779 题目描述:给定一个 n 个点,m 条有向边的带非负权图,计算从 s 出发,到每个点的距离. 这道题就是一个单源最 ...

  10. 最短路径之Floyd算法

    Floyd算法又称弗洛伊德算法,也叫做Floyd's algorithm,Roy–Warshall algorithm,Roy–Floyd algorithm, WFI algorithm. Floy ...

随机推荐

  1. jvm入门及理解(一)——简介与体系架构

    最近,在学习java虚拟机的内容中,在此总结和记录下学到的. 一.JVM在计算机中的位置 在我们初学java时,便知道java源文件文件会先通过Java编译器编译成字节码文件,这个过程是java编译过 ...

  2. Python+Tornado开发微信公众号

    本文已同步到专业技术网站 www.sufaith.com, 该网站专注于前后端开发技术与经验分享, 包含Web开发.Nodejs.Python.Linux.IT资讯等板块. 本教程针对的是已掌握Pyt ...

  3. vue-resource安装与使用

    vue-resource是vue中使用的请求网络数据的插件,这个插件是依赖于vue的,简单说就是用来调接口的. 安装 cd 项目目录 npm i vue vue-resource --save-dev ...

  4. 全方位认识HBase:一个值得拥有的NoSQL数据库(一)

    前言:说起HBase这门技术,在认知上对于稍微接触或使用过它的人来讲,可能只是百千数据库中一个很普通的库,大概就像我对Redis的认知一样:缓存嘛!可对于HBase,我确实是带着某些感情在的.今日突然 ...

  5. Hibernate框架 jar包介绍

    一直使用my eclipse集成的Hibernate来学习.最近在写hibernate的日记,写到搭建hibernate框架的时候才发现自己对hibernate的内容还是不了解,决定自己手动搭建一下. ...

  6. 弱智破解法——用python破解WIFI

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:李嘉图 PS:如有需要Python学习资料的小伙伴可以加点击下方链接自 ...

  7. stand up meeting for beta release plan 12/16/2015

    今天我们开会讨论一下beta版需要的feature,其中待定的feature是可选做的,如果有时间.其他都是必须实现的. 因为做插件的计划失败了,所以我们现在是pdf阅读器和取词查词加入生词本这两部分 ...

  8. summary && scenarios

    小组中期总结 项目目标: 我们的目标是制作一款pdf阅读器的必应查词插件,帮助大家在阅读英文资料的时候查单词更加的方便并且可以帮助人们英语学习. 痛点:对于在电脑上现在屏幕取词软件已经做得相当好了,所 ...

  9. 从Generator入手读懂co模块源码

    这篇文章是讲JS异步原理和实现方式的第四篇文章,前面三篇是: setTimeout和setImmediate到底谁先执行,本文让你彻底理解Event Loop 从发布订阅模式入手读懂Node.js的E ...

  10. Python - 调用接口合并文件夹下多个Excel表

    在工作中经常遇到需要打开许多个excel表格,然后合并的需求,合并的同时要求格式必须原汁原味的保留.利用VBA代码可以比较轻松的解决,现在我们来看Python中如何实现. 上代码: from open ...