最短路径Floyd与区间DP

news2024/11/14 19:41:13

floyd算法是求最短路径的算法,算法复杂度为n(o^3),其优点在于能够一次求解所有点到其他点的最短路径,不需要其他运算,使用二维数组存储。其三层循环自外向内分别为:中间点,起始点和终点。状态方程为:

num[i][j]=min(num[i][j],num[i][k]+num[k][j]);

num[j][i]=num[i][j];                /*在num[i][j]发生变化时num[j][i]要同时改变,如果不是图而是网的话不需要改变*/

注:num初值设定为点与点的邻接矩阵。

代码:

#include<bits/stdc++.h>
using namespace std;
int num[105][105];
int main(){
    int n=5,m=6;        /*点数和边数,可以随意设置,下附该代码的测试样例*/
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            num[i][j]=0x3f3f3f3f;
        }
    }
    for(int i=1;i<=n;i++)num[i][i]=0;        /*自己到自己一定是0*/
    for(int i=1;i<=m;i++){
        int x,y,l;
        cin>>x>>y>>l;
        num[x][y]=l;
        num[y][x]=l;
    }
    for(int k=1;k<=n;k++){
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                num[i][j]=min(num[i][j],num[i][k]+num[k][j]);
                num[j][i]=num[i][j];
            }
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(num[i][j]==0x3f3f3f3f)cout<<"-1"<<" ";
            else cout<<num[i][j]<<" ";
        }
        cout<<endl;
    }
    system("pause");
    return 0;
}
/*
1 5 3
1 2 5
2 3 1
5 3 4
3 4 2
4 5 7
*/

注:点和点在初始状态下未邻接(不连通)时,应给一个极大值,一般用1e9或0x3f3f3f3f,不建议使用0或者负数,因为这样需要在进行状态转移增加判断,而如果设置成一个极大值可以直接用algorithm头文件里的min函数直接进行赋值。

区间DP是动态规划的一种,又称为合并类动态规划,是线性动态规划的扩展,它在分阶段地划分问题时,与阶段中元素出现的顺序和由前一阶段的区间中哪些元素合并而来有很大的关系。时间复杂度也为n(o^3),其三层循环分别为:步长,起始点,终点。而步长的作用是用来挑选起始点和终点之间的任意一点,这方面和Floyd有点像,但是区别是这个中间点服从   i<k<j。而Floyd可以是任何一点。

 

 

其状态转移方程为:

 dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+num[j]-num[i-1]);

注:num是每个点的权值的前缀和数组,dp是点与点合并的值

代码:

#include<bits/stdc++.h>
#define maxsize 305
using namespace std;
int dp[maxsize][maxsize];
int num[maxsize]={0};
int main(){
    int n;
    cin>>n;
    memset(dp,0x3f3f3f3f,sizeof(dp));
    for(int i=1;i<=n;i++){
        cin>>num[i];
        num[i]+=num[i-1];
        dp[i][i]=0;
    }
    for(int d=1;d<n;d++){
        for(int i=1;i<=n-d;i++){
            int j=i+d;
            for(int k=i;k<j;k++){
                dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+num[j]-num[i-1]);
            }
        }
    }
    cout<<dp[1][n];
    system("pause");
    return 0;
}

总结:

floyd和区间dp并不完全一致,本人在做题的时候因为用了区间dp的状态转移方程踩了这个坑。另外两者存储方式上floyd可以直接在邻接矩阵上操作,而区间dp是先走一维,再走二维,操作上也并不完全一致。

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

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

相关文章

【社区图书馆】《网络工程师的Python之路:网络运维自动化实战(第2版)》

文章目录 图书前言图书简介图书作者、简介图书好评图书目录总结&#xff1a;本人选择此图书的意义 图书前言 光阴似箭&#xff0c;岁月如梭。转眼之间&#xff0c;距离本书最早的电子书出版已经过去了三年之久。承蒙广大读者的厚爱&#xff0c;电子书和第1版纸质书的发行量远远…

【云原生】Java 应用程序在 Kubernetes 上棘手的内存管理

文章目录 引言JVM 内存模型简介非 Heap 内存Heap 堆内存Kubernetes 内存管理JVM 和 Kubernetes场景 1 — Java Out Of Memory 错误场景 2 — Pod 超出内存 limit 限制场景 3 — Pod 超出节点的可用内存场景 4 — 参数配置良好&#xff0c;应用程序运行良好 结语 引言 如何结合…

PCIe-DMA多通道/高性能/超低延时/超低抖动视频采集显示V4L2驱动

1 介绍 基于PCI ExpressIntegrated Block&#xff0c;Multi-Channel PCIe QDMA Subsystem实现了使用DMA地址队列的独立多通道、高性能Continous或Scather GatherDMA&#xff0c;提供fifo/AXI4-Stream用户接口。 基于PCI ExpressIntegrated Block&#xff0c;Multi-Channel PCIe…

大型体检管理系统源码:适用于大中型医院或独立体检中心

一套专业的体检管理系统源码&#xff0c;是医院、体检中心等单位开展体检业务的得力助手。它将以往人工操作的健康体检过程所得到信息转换成全信息化的电脑管理&#xff0c;使体检过程更为流畅、更有条理&#xff0c;更加便于管理&#xff0c;从而实现体检业务管理的自动化、信…

2023年报考CSM敏捷教练认证好不好?含金量高吗?

CSM&#xff0c;Certified Scrum Master&#xff0c;是Scrum联盟发起的Scrum认证。帮助个人从自身、团队和组织层面&#xff0c;学习技能和工具来扩展实践的层面&#xff0c;帮助团队正确使用Scrum&#xff0c;从而提高项目整体成功的可能性。 认证收益 职业能力提升 推动企业…

AIGC技术周报|为文生图模型提供“参考”;交互式prompt系统:让文生图模型更懂你

AIGC通过借鉴现有的、人类创造的内容来快速完成内容创作。ChatGPT、Bard等AI聊天机器人以及DallE 2、Stable Diffusion等文生图模型都属于AIGC的典型案例。「AIGC技术周报」将为你带来最新的paper、博客等前瞻性研究。 交互式prompt系统&#xff1a;让文生图模型更懂你 文生图…

JVM性能监测工具-JConsole

JVM性能监测工具-JConsole JConsole工具是JDK自带的图形化性能监控工具。并通过JConsole工具&#xff0c; 可以查看Java应用程序的运行概况&#xff0c; 监控堆信息、 元空间使用情况及类的加载情况等。 JConsole程序在%JAVA_HOM E%/bin目录下 或者你可以直接在命令行对他进…

【Java代码】MP3、flac歌曲批量生成同名的“xxx.lrc”歌词文件导入索尼黑砖二代

目录 1、准备条件2、实现方式3、代码环境和maven依赖4、Java代码5、示例1结果6、示例2结果7、一个小问题8、“音乐标签”下载地址 1、准备条件 网易云下载的MP3、flac后缀的歌曲若干首&#xff08;ncm后缀的歌曲需要还原格式&#xff0c;不然会随着VIP过期而无法听&#xff09…

《CTFshow-Web入门》06. Web 51~60

Web 51~60 web51题解 web52知识点题解 web53知识点题解 web54知识点题解 web55知识点题解 web56知识点题解 web57知识点题解 web58知识点题解 web59题解 web60题解 ctf - web入门 web51 题解 相比上一题多过滤了 tac 命令。那换一个即可。 题解&#xff1a; url ?cnl<f…

go/java/C++覆盖率工具原理汇总学习记录

go–goc goc采用的是插桩源码的形式&#xff0c;而不是待二进制执行时再去设置breakpoints。这就导致了当前go的测试覆盖率收集技术&#xff0c;一定是侵入式的&#xff0c;会修改目标程序源码。直接看案例 package mainimport "fmt"func main() {test2(3)fmt.Prin…

Vue项目基于driverjs实现新用户导航

引导页就是当用户第一次或者手动进行触发的时候&#xff0c;提示给用户当前系统的模块介绍&#xff0c;比如哪里是退出&#xff0c;哪里是菜单等等相应的操作。 无论是开发 APP 还是 web 应用&#xff0c;新手引导都是一个很常见的需求&#xff0c;一般在这2个方面需要新手引导…

Java阶段二Day07

Java阶段二Day07 文章目录 Java阶段二Day07V17UserControllerDispatcherServletControllerRequestMapping V18DispatcherServletHandleMapping V19BirdBootApplication 线程池线程的执行过程线程池API 数据库数据库的基本概念数据库管理系统中常见的概念 SQL分类DDL语言-数据定…

浅析流媒体技术的发展趋势及EasyCVR视频技术的应用

随着科技的不断发展&#xff0c;流媒体已经成为人们日常生活中必不可少的一部分。为了进一步提高流媒体的质量&#xff0c;未来的技术革新方向将集中在以下几个方面&#xff1a; 1&#xff09;提高视频编解码技术的质量和效率 随着高清视频的普及&#xff0c;人们对流媒体的质…

GD32F470 移植STM32F429工程 Keil调试笔记

keil版本&#xff1a;5.25 安装 GigaDevice.GD32F4xx_DFP.3.0.4.pack Keil.STM32F4xx_DFP.2.15.0.pack 一、GD32F470 与 STM32F429 切换编译 1、原项目为STM32F429 工程&#xff0c;切换到GD32F470 只需在 Options for Target"“对话框的Device菜单中选中“GD32F470II”…

Http协议—请求的构造

目录 一、通过 form表单 构造HTTP请求 1、form 发送 Get 请求 &#xff08;1&#xff09;form 的重要参数 &#xff08;2&#xff09;input 的重要参数 2、通过 form 构造 Post 请求 二、通过 ajax 构造 HTTP 请求 1、基于 jQuery 中的 ajax 构造 &#xff08;1&#x…

动态网站开发讲课笔记07:EL和JSTL

文章目录 零、本节学习目标一、EL&#xff08;一&#xff09;EL基本语法1、EL的概念2、EL的语法3、案例演示&#xff08;1&#xff09;用EL读取保存的信息&#xff08;2&#xff09;使用Java代码与EL获取信息的对比 4、EL基本语法的特点 &#xff08;二&#xff09;EL中的标识符…

从语言模型到ChatGPT,大模型训练全攻略

文&#xff5c;python 前言 你是否想过&#xff0c;为什么ChatGPT能够如此火爆呢&#xff1f;我认为这主要是因为ChatGPT提供了好玩、有用的对话式交互功能&#xff0c;能够为用户提供帮助&#xff0c;而不仅仅是依靠“大”模型的魅力。毕竟&#xff0c;GPT-3在2020年就已经推出…

RedHat yum没有已启用源的解决方法

一般安装的红帽系统&#xff0c;自带的yum在没有付费的情况下是无使用的&#xff0c;所以我们要进行换源。 1、环境准备 先检查以下我们的linux系统环境&#xff0c;看看是不是Redhat7的版本 &#xff0c;出现如下图所示的界面 cat /etc/redhat-release 检查系统中是否安…

科技云报道:重塑增长新动能,“数智融合”捷径该如何走?

科技云报道原创。 如果说&#xff0c;过去是数字化转型的试验阶段&#xff0c;实施的是开荒动土、选种育苗&#xff0c;那么当前要进行的是精耕细作、植树造林。 数字化转型已进入了由个别行业、个别场景的“点状应用”向各行各业全流程、全环节“整体渗透”的关键期。 云计算…

yolov5-7.0 训练自己的数据集之检测数据集

YOLOv5是一种单阶段目标检测算法&#xff0c;有很高的精度和速度&#xff0c;因为项目需求&#xff0c;需要利用yolov5-7.0训练自己的目标检测数据集。 假设&#xff0c;环境已经配置完成&#xff01; 1&#xff09;准备数据集 在D:\Graduation_Project_Coding\network_class…