2959.力扣每日一题7/17 Java(暴力枚举+Floyd算法)

  • 博客主页:音符犹如代码
  • 系列专栏:算法练习
  • 关注博主,后期持续更新系列文章
  • 如果有错误感谢请大家批评指出,及时修改
  • 感谢大家点赞👍收藏⭐评论✍

目录

Floyd算法

解题思路

解题过程

时间复杂度

空间复杂度


Floyd算法

Floyd 算法又称为弗洛伊德算法、插点法,是一种用于解决给定加权图中顶点间最短路径的算法。它可以正确处理有向图或带有负权边的最短路径问题,同时也可用于计算有向图的传递闭包。该算法以其创始人之一、1978 年图灵奖获得者罗伯特·弗洛伊德命名。

其核心思路是通过一个图的权值矩阵求出它的每两点间的最短路径矩阵。具体来说,从图的带权邻接矩阵开始,递归地进行多次更新。其状态转移方程为:map(i, j) := min{map(i, k) + map(k, j), map(i, j)},其中map(i, j)表示 i 到 j 的最短距离,k 是穷举 i, j 的断点。

算法过程大致如下:

  1. 初始化:将距离矩阵 d(u, v)初始化为图的权值矩阵 a(u, v)。如果两点之间没有边相连,则权为无穷大(或一个足够大的数)。同时,初始化一个后继节点矩阵 path 来记录两点间的最短路径,d(i, j)初始化为 j。
  2. 迭代更新:进行 n 次更新(n 为图中顶点的数量)。对于每一对顶点 u 和 v,遍历所有的顶点 k,判断是否存在一个顶点 k 使得从 u 到 k 再到 v 比已知的路径更短。如果是,则更新距离矩阵 d(u, v)的值为 d(u, k) + d(k, v),同时更新后继节点矩阵 path(u, v)为 k。
  3. 最终得到的距离矩阵 d 中的元素 d(i, j)即为 i 号顶点到 j 号顶点的最短路径长度,而后继节点矩阵 path 中则包含了最短路径的信息。

Floyd 算法的时间复杂度为,其中 n 是图中顶点的数量。它的优点是容易理解,可以算出任意两个节点之间的最短距离,代码编写相对简单;缺点是时间复杂度较高,不太适合处理大量数据的情况。

在上述提到的问题中,使用 Floyd 算法来计算各个顶点之间的最短路径,通过三重循环遍历所有可能的中转顶点 k,以及起点 i 和终点 j,根据状态转移方程不断更新距离矩阵 f,以得到最终的最短路径信息。

解题思路

通过枚举所有可能的节点集合状态,对于每个状态,复制相关节点的距离信息到一个临时矩阵,然后在这个子集上运行 Floyd 算法计算最短路,最后检查这个子集中任意两个节点的最短路是否都不超过给定的最大距离,统计满足条件的方案数。

解题过程

  1. 首先初始化距离矩阵,根据道路信息更新矩阵中的距离值。
  2. 然后通过两层循环枚举所有可能的节点集合状态。
  3. 对于每个状态,复制相关节点的距离信息到临时矩阵,并在这个子集上运行 Floyd 算法更新最短距离。
  4. 最后检查这个子集内的最短距离是否都满足不超过最大距离的条件,若是则方案数加 1。

时间复杂度

  1. 首先初始化距离矩阵,根据道路信息更新矩阵中的距离值。
  2. 然后通过两层循环枚举所有可能的节点集合状态。
  3. 对于每个状态,复制相关节点的距离信息到临时矩阵,并在这个子集上运行 Floyd 算法更新最短距离。
  4. 最后检查这个子集内的最短距离是否都满足不超过最大距离的条件,若是则方案数加 1。

空间复杂度

  • 保存距离矩阵和临时矩阵的空间复杂度为 O(n^2)。
  • 总的空间复杂度为 O(n^2)。

Code

import java.util.Arrays;class Solution {public int numberOfSets(int numNodes, int maxDist, int[][] roadDetails) {// 创建并初始化距离矩阵 distanceMatrixint[][] distanceMatrix = new int[numNodes][numNodes];for (int[] row : distanceMatrix) {Arrays.fill(row, Integer.MAX_VALUE / 2);  // 防止加法溢出}// 根据道路信息更新距离矩阵for (int[] road : roadDetails) {int nodeA = road[0];int nodeB = road[1];int weight = road[2];distanceMatrix[nodeA][nodeB] = Math.min(distanceMatrix[nodeA][nodeB], weight);distanceMatrix[nodeB][nodeA] = Math.min(distanceMatrix[nodeB][nodeA], weight);}int solutionCount = 0;int[][] tempDistanceMatrix = new int[numNodes][numNodes];for (int nodeSetState = 0; nodeSetState < (1 << numNodes); nodeSetState++) {for (int node = 0; node < numNodes; node++) {if (((nodeSetState >> node) & 1) == 1) {System.arraycopy(distanceMatrix[node], 0, tempDistanceMatrix[node], 0, numNodes);}}// Floyd 算法(只考虑当前节点集合状态中的节点)for (int intermediateNode = 0; intermediateNode < numNodes; intermediateNode++) {if (((nodeSetState >> intermediateNode) & 1) == 0) continue;for (int sourceNode = 0; sourceNode < numNodes; sourceNode++) {if (((nodeSetState >> sourceNode) & 1) == 0) continue;for (int destinationNode = 0; destinationNode < numNodes; destinationNode++) {tempDistanceMatrix[sourceNode][destinationNode] = Math.min(tempDistanceMatrix[sourceNode][destinationNode], tempDistanceMatrix[sourceNode][intermediateNode] + tempDistanceMatrix[intermediateNode][destinationNode]);}}}// 判断当前保留的节点之间的最短路是否均不超过最大距离boolean validSet = true;for (int nodeA = 0; nodeA < numNodes; nodeA++) {if (((nodeSetState >> nodeA) & 1) == 0) continue;for (int nodeB = 0; nodeB < nodeA; nodeB++) {if (((nodeSetState >> nodeB) & 1) == 1 && tempDistanceMatrix[nodeA][nodeB] > maxDist) {validSet = false;continue;}}}if (validSet) {solutionCount++;}}return solutionCount;}
}

思想永远是宇宙的统治者。——柏拉图(Plato)

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

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

相关文章

Linux系统快速搭建轻量化网站Halo并实现无公网IP远程访问

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

AWE2025正式启动,AWE×AI 推动智慧生活的普及

7月18日&#xff0c;2025年中国家电及消费电子博览会&#xff08;AWE2025&#xff09;正式启动。主办方宣布&#xff0c;AWE2025的主题为“AI科技、AI生活”&#xff0c;展会将于2025年3月20-23日在上海新国际博览中心举办。 作为全球三大家电和消费电子领域展会之一&#xff…

一个非常好的美图展示网站整站打包源码,集成了wordpress和开源版ripro主题,可以完美运营。

一个非常好的美图展示网站整站打包源码&#xff0c;集成了wordpress和开源版ripro主题&#xff0c;可以完美运营。 自带了5个多g的美图资源&#xff0c;让网站内容看起来非常大气丰富&#xff0c;可以快速投入运营。 这个代码包&#xff0c;原网站已经稳定运营多年&#xff0…

Linux_生产消费者模型

目录 1、生产消费者模型示意图 2、生产者消费者之间的关系 3、定义交易场所 4、实现生产消费者模型 5、伪唤醒 6、多生产多消费者的实际运用 7、POSIX信号量 7.1 初始化信号量 7.2 销毁信号量 7.3 等待信号量 7.4 发布信号量 8、生产消费的环形队列模型 8.1…

Codeforces Round 942 (Div. 2)

比赛链接&#xff1a;Dashboard - Codeforces Round 942 (Div. 2) - Codeforces A题 翻译中文题面&#xff1a; 一场比赛包含 n 个问题&#xff0c;第 i 个问题的难度预期最多为 bi。已经有 n 个问题的提议&#xff0c;第 i 个问题的难度是 ai。最初&#xff0c;数组 a1,a2,……

安全与便捷并行,打造高效易用的用户支付体验

在当今数字时代&#xff0c;快捷、安全的支付方式已经成为用户日常生活中不可或缺的一部分。不论是在线购物、订阅服务&#xff0c;还是线下消费&#xff0c;用户都期望享受流畅且安全的支付体验。作为开发者&#xff0c;选择适合的支付服务不仅关乎用户体验&#xff0c;更直接…

漏洞预警:Nacos 0day漏洞触发远程代码执行

Nacos即Dynamic Naming and Configuration Service&#xff08;动态命名与配置服务&#xff09;&#xff0c;是开源的一款服务发现、配置和管理微服务的中间件。 在Nacos中新发现的0day漏洞可以触发远程代码执行&#xff0c;开源网安RASP团队检测并分析出三种类型的攻击&#x…

MySQL学习(13):SQL优化:查看SQL语句性能的方法

1.查看SOL执行频率 MySQL客户端连接成功后&#xff0c;通过如下指令&#xff0c;可以查看当前数据库的insert、update、delete、select的访问频次: show global status like Com_______; #查看全局。后面是7个下划线 使用效果如下&#xff1a; 可以看到各条命令的使用次数。…

android13读取cpu频率,并调整频率

总纲 android13 rom 开发总纲说明 目录 1.前言 2.频率类型 3.获取cpu可以调节的频率 4.获取当前频率 5.设置频率 6.最后我们写个脚本,来实现,可以通过参数获取所有cpu的频率,以及设置最大最小频率 6.1 获取cpu频率 6.2 设置最大cpu频率 6.3 设置最小 7.彩蛋 1.前…

Spring完整知识点汇总一

Spring简介 额外知识点 在之前的学习中我们在Service业务层创建Dao/Mapper数据访问层&#xff08;持久层&#xff09;的对象是通过工具类来获取对应Dao/Mapper数据访问层&#xff08;持久层&#xff09;的接口代理对象在此处我们不用工具类来获取对应Dao/Mapper数据访问层&…

图论模型-迪杰斯特拉算法和贝尔曼福特算法★★★★

该博客为个人学习清风建模的学习笔记&#xff0c;部分课程可以在B站&#xff1a;【强烈推荐】清风&#xff1a;数学建模算法、编程和写作培训的视频课程以及Matlab等软件教学_哔哩哔哩_bilibili 目录 ​1图论基础 1.1概念 1.2在线绘图 1.2.1网站 1.2.2MATLAB 1.3无向图的…

15现代循环神经网络—GRU与LSTM

目录 1.门控循环单元 GRU关注一个序列门候选隐状态(candidate hidden state)隐状态总结从零开始代码实现代码简洁实现2.长短期记忆网络 LSTM门候选记忆单元(candidate memory cell)记忆单元隐状态代码1.门控循环单元 GRU GRU 是最近几年提出来的,在 LSTM 之后,是一个稍微简…

关于 windows系统中双精度double除法编译优化导商变量不变化(代码调整+volatile) 的解决方法

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/140592209 红胖子(红模仿)的博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软…

Python爬虫(2) --爬取网页页面

文章目录 爬虫URL发送请求UA伪装requests 获取想要的数据打开网页 总结完整代码 爬虫 Python 爬虫是一种自动化工具&#xff0c;用于从互联网上抓取网页数据并提取有用的信息。Python 因其简洁的语法和丰富的库支持&#xff08;如 requests、BeautifulSoup、Scrapy 等&#xf…

基于IEKF迭代扩展卡尔曼滤波算法的数据跟踪matlab仿真,对比EKF和UKF

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于IEKF迭代扩展卡尔曼滤波算法的数据跟踪matlab仿真,对比EKF和UKF.仿真输出误差收敛曲线和误差协方差收敛曲线。 2.测试软件版本以及运行结果展示 MATLAB2022…

springboot 配置 spring data redis

1、在pom.xml引入父依赖spring-boot-starter-parent&#xff0c;其中2.7.18是最后一版支持java8的spring <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.18</…

助燃新质生产力,魔珐科技亮相IMC2024制造业数字科技大会展示有言AIGC视频工具价值

2024年7月19日&#xff0c;IMC2024第八届制造业数字科技大会在上海盛大开幕&#xff0c;本次大会以《向“智”而行》为主题&#xff0c;250智能制造行业数字化转型企业、行业领军者及实践者共聚一堂&#xff0c;共同助力企业增强技术“硬核力”&#xff0c;为新质生产力蓄势赋能…

buuctf web 第五到八题

[ACTF2020 新生赛]Exec 这里属实有点没想到了&#xff0c;以为要弹shell&#xff0c;结果不用 127.0.0.1;ls /PING 127.0.0.1 (127.0.0.1): 56 data bytes bin dev etc flag home lib media mnt opt proc root run sbin srv sys tmp usr var127.0.0.1;tac /f*[GXYCTF2019]Pin…

最新全新UI异次元荔枝V4.4自动发卡系统源码

简介&#xff1a; 最新全新UI异次元荔枝V4.4自动发卡系统源码 更新日志&#xff1a; 1增加主站货源系统 2支持分站自定义支付接口 3目前插件大部分免费 4UI页面全面更新 5分站可支持对接其他分站产品 6分站客服可自定义 7支持限定优惠 图片&#xff1a; 会员中心截图&…

多类支持向量机损失(SVM损失)

(SVM) 损失。SVM 损失的设置是&#xff0c;SVM“希望”每个图像的正确类别的得分比错误类别高出一定幅度Δ。 即假设有一个分数集合s[13,−7,11] 如果y0为真实值&#xff0c;超参数为10&#xff0c;则该损失值为 超参数是指在机器学习算法的训练过程中需要设置的参数&#xf…