Floyed理解

Floyd算法的本质是动态规划,其转移方程为:f(k,i,j) = min( f(k-1,i,j), f(k-1,i,k)+f(k-1,k,j) )

f(k-1,i,j)表示经过前k-1个点

f(k-1,i,k)+f(k-1,k,j)表示经过k这个点

f(k,i,j)表示路径除开起点i与终点j,只经过前k个点中的某些点,从i到j的最小值。

计算这个值只需要考虑两种情况:最短路经过k,和最短路不经过k(那么就经过前k-1个点中的某些点)。

由于k要从k-1转移而来,自然k为最外层的循环。而经过状态压缩(类似于背包问题)后,就变成了我们熟悉的f(i,j) = min( f(i,j), f(i,k)+f(k,j) )了。

接下来,是Floyd算法的更新过程。归纳一下它的更新过程,其实就是,每一次尝试在每一对节点Vv和Vw之间插入一个节点Vk,如果插入节点后,可以使得Vv和Vw之间的路径变短,那么进行一次更新,否则不更新。

那么,为什么按照这样的规则更新可以找到每对节点间的最短路径呢?我在这里举个例子说明一下,应该就可以把这个问题解释清楚了。假设我们事先已经知道从节点V2到V5之间的最短路径是:V2→V4→V9→V7→V5。

第一步,在初始化过程中,我们获得了(*D)[2][9]、(*D)[9][5]、(*D)[2][5]以及(*P)[2][9]、(*P)[9][5]、(*P)[2][5]的初始值。

第二步,按照Floyd算法进行迭代,迭代到k等于4时,我们会发现在V2和V9之间插入V4之后,V2和V9之间的路径长度达到了史上最低点,(*D)[2][9]更新为(*D)[2][4]+(*D)[4][9],(*P)[2][9]更新为4。而且在之后的迭代中都不会出现更短的路径,所以(*D)[2][9]和(*P)[2][9]在之后的迭代中都不会发生改变。

第三步,迭代到k等于7时,V9和V5之间的路径长度达到了史上最低点,(*D)[9][5]更新为(*D)[9][7]+(*D)[7][5],(*P)[9][5]更新为7,此后不再改变。

第四步,迭代到k等于9时,V2和V5之间的路径长度达到了史上最低点,(*D)[2][5]更新为(*D)[2][9]+(*D)[9][5],(*P)[2][5]更新为9,此后不再改变。这样也就找到了V2和V5之间的最短路径。

现在,我们算出了V2和V5之间的最短路径的长度,但是,怎样找到这条路径的轨迹呢?其实就是根据*P来推断。以上面的例子为例,如果我们要打印V2和V5之间的最短路径的轨迹。首先我们知道(*P)[2][5]=9,初步确定轨迹为V2→V9→V5。根据(*P)[2][9]=4且(*P)[9][5]=7,初步确定轨迹为V2→V4→V9→V7→V5。根据(*P)[2][4]=2,(*P)[4][9]=4,(*P)[9][7]=9,(*P)[7][5]=7,我们可以确定没有新的节点需要加入,所以确定最终的轨迹为V2→V4→V9→V7→V5。

Floyed题目推荐:

【P1119】灾后重建 - 洛谷
https://www.luogu.org/problem/show?pid=1119

【P1078】文化之旅 - 洛谷
https://www.luogu.org/problem/show?pid=1078

Floyed理解的更多相关文章

  1. [NOIP2016]换教室 D1 T3 Floyed+期望DP

    [NOIP2016]换教室 D1 T3 Description 对于刚上大学的牛牛来说, 他面临的第一个问题是如何根据实际情况中情合适的课程. 在可以选择的课程中,有2n节课程安排在n个时间段上.在第 ...

  2. floyed算法

    Floyed算法(实际是动态规划问题) 问题:权值矩阵matrix[i][j]表示i到j的距离,如果没有路径则为无穷 求出权值矩阵中任意两点间的最短距离 分析:对于每一对定点u,v看是否存在一个点w使 ...

  3. hdu 1385(Floyed+打印路径好题)

    Minimum Transport Cost Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/O ...

  4. Floyed(floyd)算法详解

    是真懂还是假懂? Floyed算法:是最短路径算法可以说是最慢的一个. 原理:O(n^3)的for循环,对每一个中间节点k做松弛(寻找更短路径): 但它适合算多源最短路径,即任意两点间的距离. 但sp ...

  5. 理解CSS视觉格式化

    前面的话   CSS视觉格式化这个词可能比较陌生,但说起盒模型可能就恍然大悟了.实际上,盒模型只是CSS视觉格式化的一部分.视觉格式化分为块级和行内两种处理方式.理解视觉格式化,可以确定得到的效果是应 ...

  6. 彻底理解AC多模式匹配算法

    (本文尤其适合遍览网上的讲解而仍百思不得姐的同学) 一.原理 AC自动机首先将模式组记录为Trie字典树的形式,以节点表示不同状态,边上标以字母表中的字符,表示状态的转移.根节点状态记为0状态,表示起 ...

  7. 理解加密算法(三)——创建CA机构,签发证书并开始TLS通信

    接理解加密算法(一)--加密算法分类.理解加密算法(二)--TLS/SSL 1 不安全的TCP通信 普通的TCP通信数据是明文传输的,所以存在数据泄露和被篡改的风险,我们可以写一段测试代码试验一下. ...

  8. node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理

    一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...

  9. 如何一步一步用DDD设计一个电商网站(一)—— 先理解核心概念

    一.前言     DDD(领域驱动设计)的一些介绍网上资料很多,这里就不继续描述了.自己使用领域驱动设计摸滚打爬也有2年多的时间,出于对知识的总结和分享,也是对自我理解的一个公开检验,介于博客园这个平 ...

随机推荐

  1. SQLServer2008 关于数据转换

    全进位 select cast(ceiling(2.1111) as dec(18,0)) 结果:3

  2. List 练习

    (List)已知有一个Worker 类如下: public class Worker { private int age; private String name; private double sa ...

  3. 创建dml触发器

    -实现删除学生信息时把该学生的成绩记录全部清空 --判断触发器是否存在 if exists(select * from sysobjects where name = 'delete_student' ...

  4. yar 调用rpc方法

    <?php class RpcController extends Yaf_Controller_Abstract { //RPC入口 public function indexAction($ ...

  5. 【sqli-labs】 less23 Error based - strip comments (GET型基于错误的去除注释的注入)

    . 加单引号报错 加# http://localhost/sqli-labs-master/Less-23/?id=1'%23 错误没有改变,推测过滤了# 查看源码发现# -- 都被替换掉了 那么可用 ...

  6. springboot 的 @Async

    /** * Created by zhiqi.shao on 2018/4/3. */ @EnableAsync @Configuration public class TaskPoolConfig ...

  7. js获取当前具体时间

    /** * 获取当前时间 * @param isTime true:显示日期和时间,如:2018-09-20 13:25:12:false:显示日期,如:2018-09-20. * @returns ...

  8. 1.1、配置Python虚拟环境

    安装虚拟环境 系统:CentOS 7.2 python版本:Python 2.7.5 1.虚拟环境介绍 虚拟环境是Python解释器的一个私有副本,在这个环境中你可以安装私有包,而且不会影响系统中安装 ...

  9. Linux目录与相关配置文件讲解

    linux目录介绍及配置文件详细介绍 重要目录简介 目录名 作用 boot 与电脑启动相关,推荐单独分区. etc 存放配置文件 mnt 一般用来设置挂载点 src.sys.proc 与系统内核相关, ...

  10. 57.query phase

    主要知识点: query phase步骤 query phase如何提升性能     一.query phase步骤 一次query phase一般包括以下三个步骤     The query pha ...