Floyd

Floyd

  • 本质:DP

  • 算法特点:多源最短路,能一次性求解所有点对间的最短距离

  • 适用对象:小图,允许边权为负,无法适用于负环图(负环:环上边权之和为负的环,当任意时刻出现 d p [ i ] [ i ] < 0 dp[i][i]<0 dp[i][i]<0时则有负环)

  • 存储结构:邻接矩阵,若有重边读入时必须取最小边

  • 核心思想:枚举每个点作为中转点,看每一点对是否能通过中转点使路径更优

  • 算法流程:闫氏DP分析法

    • 状态表示:

      • 集合:定义状态矩阵 d p k [ i ] [ j ] dp_k[i][j] dpk[i][j],表示在 i i i j j j的路径上,所经过的顶点编号 ≤ k \le k k的最短路长度(初始化为 + ∞ +\infty +表示该点不可达,主对角线初始化为0)。路径矩阵 p a t h k [ i ] [ j ] path_k[i][j] pathk[i][j]表示考查第 k k k个顶点之后, j j j点的上一个来源顶点(初始化为 − 1 -1 1表示无路径)。
      • 属性: M i n Min Min
      • 初始化:初始状态即为原邻接矩阵
    • 状态计算: d p k [ i ] [ j ] dp_k[i][j] dpk[i][j]:对于第 k k k个顶点:与其他 D P DP DP问题不同,此处确保第 k k k个点一定可选:

      • 不选第 k k k个点:若选择第 k k k个点作为中转点无法对 i i i j j j路径进行松弛(无法保证最优),则不选。路径状态仍为 [ i , j ] [i,j] [i,j],直接继承自 k − 1 k-1 k1个顶点时 i i i j j j的路径。 d p k [ i ] [ j ] = d p k − 1 [ i ] [ j ] dp_k[i][j]=dp_{k-1}[i][j] dpk[i][j]=dpk1[i][j]
      • 选第 k k k个点:选择第 k k k个点作为中转点会使 i i i j j j的路径松弛,则选第 k k k个点。路径状态变更为 [ i , k ] , [ k , j ] [i,k],[k,j] [i,k],[k,j],继承自 k − 1 k-1 k1个顶点时 i i i k k k k k k j j j的路径,并相加。 d p k [ i ] [ j ] = d p k − 1 [ i ] [ k ] + d p k − 1 [ k ] [ j ] dp_k[i][j]=dp_{k-1}[i][k]+dp_{k-1}[k][j] dpk[i][j]=dpk1[i][k]+dpk1[k][j]
    • 状态转移方程式: d p k [ i ] [ j ] = m i n ( d p k − 1 [ i ] [ j ] , d p k − 1 [ i ] [ k ] + d p k − 1 [ k ] [ j ] ) dp_k[i][j]=min(dp_{k-1}[i][j],dp_{k-1}[i][k]+dp_{k-1}[k][j]) dpk[i][j]=min(dpk1[i][j],dpk1[i][k]+dpk1[k][j])

  • 复杂度: O ( V 3 ) O(V^3) O(V3)

Floyd在大多数情形下必须使用自我滚动将空间复杂度降低到 O ( V 2 ) O(V^2) O(V2)才能使用。下面仍给出朴素版供对比。

朴素版

using ll=long long;
const ll INF=__LONG_LONG_MAX__;
extern ll dp[MAXV][MAXV][MAXV],path[MAXV][MAXV][MAXV];//dp[0][MAXV][MAXV]已默认存储图的边权数据的最小值
extern ll n;//点数
void floyd(){for(ll k=0;k<n;k++){for(ll i=0;i<n;i++){for(ll j=0;j<n;j++){if(dp[k-1][i][k]!=INF&&dp[k-1][k][j]!=INF&&dp[k-1][i][j]>dp[k-1][i][k]+dp[k-1][k][j]){//松弛操作,特判!=INF是为了防止数据溢出dp[k][i][j]=dp[k-1][i][k]+dp[k-1][k][j];path[k][i][j]=path[k-1][k][j];}else{dp[k][i][j]=dp[k-1][i][j];path[k][i][j]=path[k-1][i][j];}}}}
}

滚动数组优化

交替滚动

using ll=long long;
const ll INF=__LONG_LONG_MAX__;
extern ll dp[2][MAXV][MAXV],path[2][MAXV][MAXV];//dp[0][MAXV][MAXV]已默认存储图的边权数据的最小值
extern ll n;//点数
void floyd(){ll work=0,old=1;for(ll k=0;k<n;k++){swap(work,old);for(ll i=0;i<n;i++){for(ll j=0;j<n;j++){if(dp[old][i][k]!=INF&&dp[old][k][j]!=INF&&dp[old][i][j]>dp[old][i][k]+dp[old][k][j]){//松弛操作,特判!=INF是为了防止数据溢出dp[work][i][j]=dp[old][i][k]+dp[old][k][j];path[work][i][j]=path[old][k][j];}else{dp[work][i][j]=dp[old][i][j];path[work][i][j]=path[old][i][j];}}}}
}

自我滚动

using ll=long long;
const ll INF=__LONG_LONG_MAX__;
extern ll dp[MAXV][MAXV],path[MAXV][MAXV];//dp[MAXV][MAXV]已默认存储图的边权数据的最小值
extern ll n;//点数
void floyd(){for(ll k=0;k<n;k++){for(ll i=0;i<n;i++){//if(dp[i][k]!=INF&&i!=k)//此处为小优化,提前判断,若常规写法T掉可尝试for(ll j=0;j<n;j++){if(dp[i][k]!=INF&&dp[k][j]&&dp[i][j]>dp[i][k]+dp[k][j]){//松弛操作,特判!=INF是为了防止数据溢出dp[i][j]=dp[i][k]+dp[k][j];path[i][j]=path[k][j];}}}}
}

路径输出

void print(ll s,ll t){if(s==t){cout<<s<<' ';return;}print(s,path[s][t]);cout<<t<<' ';
}

应用:传递闭包

传递闭包:求所有元素间的传递连通关系

算法流程:定义状态数组 d p [ i ] [ j ] dp[i][j] dp[i][j],表示 i i i j j j的连通性(直接/间接到达)。当 i i i j j j连通时, d p [ i ] [ j ] = 1 dp[i][j]=1 dp[i][j]=1;否则 d p [ i ] [ j ] = 0 dp[i][j]=0 dp[i][j]=0

朴素版( O ( V 3 ) O(V^3) O(V3))

void floyd(){for(int k=0;k<n;k++)for(int i=0;i<n;i++)//if(dp[i][k])//小优化,提前判断,若T掉可尝试for(int j=0;j<n;j++)if(dp[i][k]&&dp[k][j])dp[i][j]=1;//6-7行可合并为dp[i][j]|=dp[i][k]&dp[k][j]
}

bitset优化( O ( V 2 ) O(V^2) O(V2))

bitset<N>d[N];
void floyd(){for(int k=0;k<n;k++)for(int i=0;i<n;i++)if(d[i][k]) d[i]|=d[k];
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/48013.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring模块

1 事务注解Transactional 默认的隔离等级&#xff1a;DEFAULT&#xff0c;使用数据库的隔离等级。(读未提交、读已提交、可重复读、串行化、DEFAULT) 默认的传播行为&#xff1a;REQUIRED&#xff0c;有事务则加入当前事务&#xff0c;没有事务则创建一个新的事务 默认的回滚…

基于3D开发引擎HOOPS平台的大型三维PLM系统的设计、开发与应用

产品生命周期管理&#xff08;Product Lifecycle Management&#xff0c;PLM&#xff09;系统在现代制造业中扮演着至关重要的角色。随着工业4.0和智能制造的推进&#xff0c;PLM系统从最初的CAD和PDM系统发展到现在的全面集成、协作和智能化的平台。本文将探讨基于HOOPS平台的…

【python】Numpy运行报错分析:IndexError与形状不匹配问题

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

森林防火,森林防火智能储水罐_鼎跃安全

森林防火是保护森林的重要措施&#xff0c;每年发生的森林火灾都严重威胁着自然安全&#xff0c;对社会经济和生态造成严重的破坏。为了切实有效地预防并扑灭森林火灾&#xff0c;森林防火智能储水罐已成为现代森林防火体系中的重要装备。 储水罐内置传感器和控制系统&#xff…

【CTFWP】ctfshow-web32

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 题目介绍&#xff1a;题目分析&#xff1a;payload&#xff1a;payload解释&#xff1a;flag 题目介绍&#xff1a; <?php/* # -*- coding: utf-8 -*- # Autho…

【每日刷题Day85】

【每日刷题Day85】 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 125. 验证回文串 - 力扣&#xff08;LeetCode&#xff09; 2. 43. 字符串相乘 - 力扣&#xff08;L…

DC系列靶场---DC 2靶场的渗透测试(二)

漏洞利用及探测 rbash逃逸 虽然我们现在已经可以执行切换路径命令了&#xff0c;但是发现还有是很多命令不能用。 我想看看一下目标主机的所有用户&#xff0c;是不能执行的。 那我们就用到了当前shell逃逸。第一种情况&#xff1a;/ 被允许的情况下&#xff1b;直接 /bin/s…

SpringBoot原理解析(二)- Spring Bean的生命周期以及后处理器和回调接口

SpringBoot原理解析&#xff08;二&#xff09;- Spring Bean的生命周期以及后处理器和回调接口 文章目录 SpringBoot原理解析&#xff08;二&#xff09;- Spring Bean的生命周期以及后处理器和回调接口1.Bean的实例化阶段1.1.Bean 实例化的基本流程1.2.Bean 实例化图例1.3.实…

go 协程池的实现

使用场景 这次需求是做一个临时的数据采集功能&#xff0c;为了将积压的数据快速的消耗完&#xff0c;但是单一的脚本消耗的太慢&#xff0c;于是乎就手写了一个简单的协程池&#xff1a; 为了能加快数据的收集速度为了稳定协程的数量&#xff0c;让脚本变得稳定 设计图如下…

数据增强:机器学习中的数据魔法

数据增强&#xff1a;机器学习中的数据魔法 在机器学习领域&#xff0c;数据是模型训练的基石。然而&#xff0c;获取大量高质量的训练数据往往是一个挑战。数据增强技术应运而生&#xff0c;它通过从现有数据中生成新的变体来增加数据集的多样性和丰富性。本文将深入探讨数据…

微服务分布式事务

1、分布式事务是什么&#xff1f; 微服务架构中的分布式事务是指在多个服务实例之间保持数据一致性的机制。由于微服务通常涉及将业务逻辑拆分成独立的服务&#xff0c;每个服务可能有自己的数据库&#xff0c;因此当一个业务操作需要跨多个服务进行时&#xff0c;确保所有服务…

sbti科学碳目标倡议是什么

在科学界、工业界以及全球政策制定者的共同努力下&#xff0c;一个名为“科学碳目标倡议”&#xff08;Science Based Targets initiative&#xff0c;简称SBTi&#xff09;的全球性合作平台应运而生。这一倡议旨在推动企业和组织设定符合气候科学要求的减排目标&#xff0c;以…

2023年国际高校数学建模竞赛

2023年国际高校数学建模竞赛是一项由国际(澳门)学术研究院数学科学研究所、数学建模研究与应用期刊社联合香港数学研究与应用学会主办的国际性学科竞赛&#xff0c;该竞赛已获澳门特别行政区政府澳门基金会&#xff08;行政长官直属&#xff09;立项资助。以下是对该竞赛的详细…

生成式AI未来发展方向充满了无限可能与挑战

生成式AI&#xff0c;作为人工智能领域的一个前沿分支&#xff0c;其未来发展方向充满了无限可能与挑战&#xff0c;将对多个行业产生深远影响。以下是我对生成式AI未来发展方向的几点看法&#xff1a; 技术融合与创新 未来&#xff0c;生成式AI将更加注重与其他技术的深度融合…

问题记录-SpringBoot 2.7.2 整合 Swagger 报错

详细报错如下 报错背景&#xff0c;我将springboot从2.3.3升级到了2.7.2&#xff0c;报了下面的错误&#xff1a; org.springframework.context.ApplicationContextException: Failed to start bean documentationPluginsBootstrapper; nested exception is java.lang.NullPo…

信息收集Part3-资产监控

Github监控 便于收集整理最新exp或poc 便于发现相关测试目标的资产 各种子域名查询 DNS,备案&#xff0c;证书 全球节点请求cdn 枚举爆破或解析子域名对应 便于发现管理员相关的注册信息 通过Server酱接口接收漏洞信息 https://sct.ftqq.com/ https://github.com/easych…

从苏宁电器到卡巴斯基(第二部)第36篇:我当高校教师的这几年 XII

你们是八九点钟的太阳 想想也是有趣,自从我2018年3月入职X高校之后,一直到2019年9月,在这3个学期的时间里面,我讲课的对象全都是大三的同学,而且都是属于专业方向课,比如网络安全、物联网这种。第一学期尽管也教过C++,但是他们毕竟已经是大三第二学期,从心态上来说,他…

2024.7.23(DNS正向解析)

回顾&#xff1a; # 安装 samba yum -y install samba # 自建库&#xff0c;只下载&#xff0c;不安装 yum -y install --downloadonly --downloaddir./soft/ # 配置samba vim /etc/samba/smb.conf # 配置 [xxxxxxxname] commentdasdffsffdslfdjsa path/share …

h5点击电话号跳转手机拨号

需要使用到h5的 <a>标签 我们首先在<head>标签中添加代码 <meta name"format-detection" content"telephoneyes"/>然后再想要的位置添加代码 <a href"tel:10086"> 点击拨打&#xff1a;10086 </a> 这样功能就实现…

海量数据处理(面试)

海量数据 1、从大量的URL中找出相同的URL 解法&#xff1a; 分治法&#xff1a; 如果是单个很大的文件&#xff0c;直接划分文件&#xff0c;按特定大小划分&#xff0c;然后多线程&#xff0c;用map对各个文件进行统计。 如果是两个很大的文件&#xff0c;a和b。通过遍历a…