【原创】5分钟拿下Floyd算法

文章目录

  • 问题描述
  • 算法流程
  • 5分钟拿下

问题描述

一天小明捧着一本世界地图在看,突然小明拿起笔,将他最爱的那些城市标记出来,并且随机的将这些城市中的某些用线段两两连接起来。
小明量出了每条线段的长度,现在小明想知道在这些线段组成的图中任意两个城市之间的最短距离是多少。

输入包含多组测试数据。
每组输入第一行为两个正整数n(n<=10)和m(m<=n*(n-1)/2),n表示城市个数,m表示线段个数。
接下来m行,每行输入三个整数a,b和l,表示a市与b市之间存在一条线段,线段长度为l。(a与b不同)
每组最后一行输入两个整数x和y,表示问题:x市与y市之间的最短距离是多少。(x与y不同)
城市标号为1~n,l<=20。

算法流程

需要维护一个dist,dist[a][b] = l,表示从a点到b点需要的距离(权重)。
如果没有给出两点之间的权重,我们认为这两个点之间无限远,为了防止相加超出整数范围,INF = Integer.MAX_VALUE / 2 。

import java.util.*;
class Main{public static final int INF = Integer.MAX_VALUE / 2;public static void main (String[] args) {Scanner scanner = new Scanner(System.in);while(scanner.hasNext()){// n个城市int n = scanner.nextInt();// m条线段int m = scanner.nextInt();//dist[a][b]=l,a,b两个顶点的举例是l。int [][] dist = new int [n + 1][n + 1];// 初始化dist矩阵  自己到自己的距离是0,默认是INF,最大值。for(int i = 1 ;i <= n ; i ++){for(int j = 1 ; j <= n ; j ++){if(i == j){dist[i][j] = 0;}else{dist[i][j] = INF;}}}// 放入我们的数据while(m -- > 0){int a = scanner.nextInt();int b = scanner.nextInt();int l = scanner.nextInt();// 放入distfor(int i = 1 ; i <= n ; i ++){for(int j = 1 ;j <= n ; j ++){//无向图,a到b,b到a距离一样dist[a][b] = l;dist[b][a] = l;}}}// 算法核心部分 计算图中所有顶点对的最小距离// 遍历每个顶点,将i作为其他所有顶点对的中转点。for(int i = 1 ; i <= n ; i++){// 遍历所有路径可能的起始点for(int j = 1 ; j <= n ; j ++){// 遍历所有路径可能的终点for(int k = 1 ; k <= n ; k ++){// 如果,起点到中转点的距离 + 中转点到终点的距离 < 起始点到终点的距离if(dist[j][i] + dist[i][k] < dist[j][k]){// 起始点到终点的距离 == 起点到中转点的距离 + 中转点到终点的距离dist[j][k] = dist[j][i] + dist[i][k];}}}}// 读取要查询的两个城市int x = scanner.nextInt();int y = scanner.nextInt();System.out.println(dist[x][y] == INF ? "No path" : dist[x][y]);}}
}

5分钟拿下

该算法用来找出图中所有顶点对之间的最小距离。注意,所有顶点对之间的最小距离,最后都放在dist里了。

这里说成距离不好理解,其实算的是一种权重。

我们举一个简单的例子,从家到学校(我们看成两个节点),之前你一直是坐豪华轿车,需要花10块钱(看成两点之间的距离权重)。
后来你家破产了,10块钱都没有了,于是你要寻找一种最便宜,最经济的方法。你有很多认识的同学,i1,i2,i3(不同节点)。
你在想,我先坐公交去他们家,然后再坐公交去学校,这样可能便宜很多。于是你找了所有的同学,一个一个尝试,先从你家到同学家,再从同学家到学校。
过程中,你自己维护了一个dist,每次有新的省钱路径,你都记录到dist中,这样最后,从你家到学校的那个dist,就是最便宜的(最短距离/权重)。

当然,这只是其中一个简化的模型,我们分析一下下面的代码:

  • 第一层for循环:就是找所有人的家(节点),把每个人的家作为中间点。

  • 第二层for循环:就是找所有的起点,这里我们维护的dist,是图中所有节点之间的最小权重。因为只有把图中的所有节点都跑一遍,你才能发现最省钱的路径。

  • 第三层for循环:找所有的终点。

  • 如果,起点到中转点的距离 + 中转点到终点的距离 < 起始点到终点的距离,就更新起始点到终点的距离。

在算法中,你不仅检查了朋友的家,而且检查了所有人的家(不愧是你)。这就确保了你找到了最短的路径,因为你没有忽略任何可能的路线。这就是Floyd-Warshall算法之所以能够得出正确答案的原因。

   // 遍历每个顶点,将i作为其他所有顶点对的中转点。for(int i = 1 ; i <= n ; i++){// 遍历所有路径可能的起始点for(int j = 1 ; j <= n ; j ++){// 遍历所有路径可能的终点for(int k = 1 ; k <= n ; k ++){// 如果,起点到中转点的距离 + 中转点到终点的距离 < 起始点到终点的距离if(dist[j][i] + dist[i][k] < dist[j][k]){// 起始点到终点的距离 == 起点到中转点的距离 + 中转点到终点的距离dist[j][k] = dist[j][i] + dist[i][k];}}}}

如果觉得写的不错,可以点一个关注~

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

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

相关文章

单片机-- 数电(3)

编码器与译码器 译码 &#xff1a;将二进制代码转化为其他进制的代码 编码 &#xff1a;就是将其他代码转换为二进制码 编码器的类型 1二进制编码器 用n位二进制数码对2的n次方个输入信号进行编码的电路 2二-十进制编码器 将0到9十个十进制数转化为二进制代码的电路 2…

crossover虚拟机 crossover软件干嘛的 虚拟机软件的使用方法 mac虚拟机装windows

与传统的虚拟机软件&#xff08;如VMware、VirtualBox&#xff09;相比&#xff0c;CrossOver具有更高的运行效率和更好的用户体验。因为它并不创建一个完整的Windows虚拟机&#xff0c;而是仅模拟应用程序所需的运行环境。这使得CrossOver在启动和运行Windows应用程序时更加快…

手撕HashMap底层源码(学习内容全)

day28上 集合框架 标绿已经学习底层&#xff0c;深入底层主要是研究实现类底层 手撕HashMap底层源码 JDK1.7版本的HashMap为例&#xff08;注意实验代码时进行版本切换&#xff09; 代码注释参考理解 //day27初识 public class HashMap<K,V> extends AbstractMap<K,…

洛谷 P1246编码

编码 题目描述 编码工作常被运用于密文或压缩传输。这里我们用一种最简单的编码方式进行编码&#xff1a;把一些有规律的单词编成数字。 字母表中共有 26 26 26 个字母 a , b , c , ⋯ , z \mathtt{a,b,c,\cdots,z} a,b,c,⋯,z&#xff0c;这些特殊的单词长度不超过 6 6 …

SpringBoot3整合Mybatis-Plus与PageHelper包冲突解决

&#x1f60a; 作者&#xff1a; 一恍过去 &#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390 &#x1f38a; 社区&#xff1a; Java技术栈交流 &#x1f389; 主题&#xff1a; SpringBoot3整合Mybatis-Plus与PageHelper包冲突解决 ⏱️ 创作时间&a…

Elasticsearch - Docker安装Elasticsearch8.12.2

前言 最近在学习 ES&#xff0c;所以需要在服务器上装一个单节点的 ES 服务器环境&#xff1a;centos 7.9 安装 下载镜像 目前最新版本是 8.12.2 docker pull docker.elastic.co/elasticsearch/elasticsearch:8.12.2创建配置 新增配置文件 elasticsearch.yml http.host…

大模型时代,微软AI投资的布局

这些领域涉及 3D、代码、销售、游戏等多个行业。其中&#xff1a; 在 3D 领域&#xff0c;blackshark.ai 利用 AI 技术提供地理空间数据解决方案&#xff1b;humane 专注于人机交互技术创新&#xff1b;Builder.ai 提供了无需编程知识的应用构建平台。代码方面&#xff0c;GitH…

C++ 编程入门指南:深入了解 C++ 语言及其应用领域

C 简介 什么是 C&#xff1f; C 是一种跨平台的编程语言&#xff0c;可用于创建高性能应用程序。 C 是由 Bjarne Stroustrup 开发的&#xff0c;作为 C 语言的扩展。 C 为程序员提供了对系统资源和内存的高级控制。 该语言在 2011 年、2014 年、2017 年和 2020 年进行了 4…

Allegro许可有效期

在数字化经济的时代&#xff0c;软件已经成为企业运营的关键要素。然而&#xff0c;如何确保软件许可的有效性&#xff0c;避免因过期使用带来的风险&#xff0c;是企业面临的挑战。Allegro作为业界领先的软件解决方案提供商&#xff0c;为企业提供了一站式的许可有效期管理方案…

Java基础学习笔记三

环境变量CLASSPATH classpath环境变量是隶属于java语言的&#xff0c;不是windows操作系统的&#xff0c;和PATH环境变量完全不同classpath环境变量是给classloader&#xff08;类加载器&#xff09;指路的java A 。执行后&#xff0c;先启动JVM&#xff0c; JVM启动classload…

GIS学习

匹配查询&#xff0c;先连接两个表&#xff0c;然后在一个表里面查询 合并两个形状 比较好的colormap http://soliton.vm.bytemark.co.uk/pub/cpt-city/views/totp-cpt.html https://docs.gmt-china.org/latest/cpt/builtin-cpt/ 计算坡度时就要捕捉栅格 重分类时也要捕捉栅…

数据结构:10、排序

本文将会介绍8种排序&#xff0c;并在文章末附上代码 一、排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;…

[蓝桥杯 2019 省 A] 外卖店优先级

模拟 双指针 #include<iostream> #include<algorithm> using namespace std; using ll long long; #define int long long const int N 1e510; const int inf 0x3f3f3f3f; const int mod 1e97;int n,m,ts;bool vis[N]; int a[N]; int last[N]; pair<int,int…

外卖项目:菜品管理功能代码实现(debug)

文章目录 一、菜品管理功能代码实现1、新增菜品2、菜品分页查询3、修改菜品4、菜品的起售与停售5、删除菜品 一、菜品管理功能代码实现 1、新增菜品 这涉及到多张表&#xff0c;要用事务 添加成功 2、菜品分页查询 3、修改菜品 该页面共涉及4个接口。 接口&#xff1a; 根…

fastutil 代替java 集合框架

背景 java的集合框架中ArrayList&#xff0c;Map&#xff0c;Set等是我们平时最常用的集合类&#xff0c;但是由于这些集合类涉及拆装箱操作&#xff0c;所以内存的消耗比较大&#xff0c;并且性能也不是非常理想&#xff0c;在应付大量的数据时&#xff0c;容易导致gc以及性能…

protobuf原理解析-基于protobuf-c实现序列化,反向序列化

1.一个实例 前面介绍了使用protobuf的流程&#xff0e; (1). 定义proto文件来描述需要序列化和反向序列化传输的消息&#xff0e; (2). 借助proto-c&#xff0c;为proto文件生成对应的代码控制文件&#xff0e; (3). 程序借助生成的代码控制文件和protobuf-c动态库的支持实现类…

如何写出干净的 Git Commit

大家好&#xff0c;我是楷鹏。 写一份干净的 Git Commit&#xff0c;不仅赏心悦目&#xff0c;也有诸多好处&#xff0c;比如 为项目或者仓库生成 change log方便在其他一些 Git 工具使用&#xff0c;比如 CI/CD、代码协作和审计平台、发版工具等 这是 AngularJS 仓库的 Git …

身份证文字识别ocr免费-身份证实名认证接口-护照识别-Java调用代码

文字识别技术是针对图片上的文字进行提取&#xff0c;免去人们手动输入的繁琐。针对证件&#xff0c;翔云提供了身份证识别接口、身份证实名认证接口、护照识别接口&#xff0c;身份证识别接口自动提取身份证信息、身份证实名认证接口实时联网查验身份证的真伪。 以身份证识别…

ActiViz三维场景的基本要素——角色(Actor)

文章目录 前言一、基本属性二、Actor的应用三、高级功能四、示例代码和应用五、总结前言 在ActiViz中,Actor是一种重要的可视化对象,用于表示三维场景中的几何形状、模型或数据。Actors充当了将数据映射到图形管线中的角色,是呈现三维可视化的基础组件之一。通过Actor,用户…

go 解决货币计算的难题:避免浮点数陷阱

在开发的初始阶段&#xff0c;我们经常会遇到“浮点数精度”和“货币值表示”的问题。 那么&#xff0c;如何处理货币&#xff0c;如何存储和传递它们。 为什么是问题&#xff1f; Go语言中的标准浮点类型具有一定的精度&#xff08;像其他任何语言一样&#xff09;&#xf…