代码随想录算法训练营第六十四天|Floyd 算法、A * 算法、最短路算法总结

news2024/9/21 14:38:50

97. 小明逛公园

在这里插入图片描述
在这里插入图片描述

Floyd 算法

Floyd-Warshall算法是一种用于求解图中所有节点对之间最短路径的经典算法。它的时间复杂度为O(n^3),适用于节点数量不多(通常不超过几百个)的密集图。该算法不仅能处理带权有向图,还能处理带权无向图。

核心思想:动态规划
Floyd-Warshall算法通过引入中间节点的方式,逐步更新节点对之间的最短路径。先遍历中间节点k的原因是为了确保每次更新节点对(i, j)的路径时,都已经考虑过通过所有之前的节点(从1到k-1)作为中间节点的可能性

算法步骤:

1.	初始化:将每个节点对之间的初始距离存储在一个二维数组grid中。如果存在直接边,则将grid[i][j]设为对应的边权重;如果不存在,则设为一个大值(通常表示无穷大),自身到自身的距离设为0。
2.	动态规划:
•	通过引入中间节点k逐步更新最短路径。
•	三重循环遍历每个节点对,并检查通过每个中间节点k是否能找到更短的路径。
•	具体地,检查dist[i][j]是否大于dist[i][k] + dist[k][j],如果是则更新dist[i][j]为后者。
3.	输出结果:完成所有更新后,dist[i][j]中存储的就是节点i到节点j的最短路径长度。

代码实现:

 public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // 读取节点数n和边数m
        int n = scanner.nextInt();
        int m = scanner.nextInt();
        
        // 初始化grid数组,表示节点间的最短路径
        int[][] grid = new int[n + 1][n + 1];
        
        // 将grid数组中的所有值初始化为较大值(表示无穷大)
        for (int[] ints : grid) {
            Arrays.fill(ints, 10005);
        }

        // 自身到自身的距离设为0
        for (int i = 1; i <= n; i++) {
            grid[i][i] = 0;
        }

        // 读取边的信息并更新grid数组
        for (int i = 0; i < m; i++) {
            int s = scanner.nextInt(); // 起点
            int t = scanner.nextInt(); // 终点
            int val = scanner.nextInt(); // 边的权重
            grid[s][t] = val; // 初始时刻的最短路径
            grid[t][s] = val; // 无向图,双向更新
        }

        // 读取查询的计划数
        int q = scanner.nextInt();
        int[][] plans = new int[q][2];
        
        // 读取查询计划的起点和终点
        for (int i = 0; i < q; i++) {
            plans[i][0] = scanner.nextInt();
            plans[i][1] = scanner.nextInt();
        }

        // 使用Floyd-Warshall算法进行多阶段动态规划求解最短路径
        for (int k = 1; k <= n; k++) {
            for (int i = 1; i <= n; i++) {
                for (int j = 1; j <= n; j++) {
                    // 更新最短路径
                    grid[i][j] = Math.min(grid[i][j], grid[i][k] + grid[k][j]);
                }
            }
        }

        // 输出每个查询计划的结果
        for (int[] plan : plans) {
            int start = plan[0];
            int end = plan[1];
            int res = grid[start][end];
            // 如果距离还是初始的较大值,表示两点之间无路径
            System.out.println(res == 10005 ? -1 : res);
        }
    }

127. 骑士的攻击在这里插入图片描述

A * 算法

A*算法是一种用于图搜索的启发式算法,广泛应用于路径规划和导航等领域。它结合了Dijkstra算法的最短路径搜索和启发式搜索策略,能够高效地找到从起点到终点的最短路径。

A*算法的基本思路:

A*算法通过以下三个值来进行路径搜索:

1.	G值:从起点到当前节点的实际消耗。
2.	H值:从当前节点到终点的预估消耗(启发式函数)。
3.	F值:F = G + H,表示经过当前节点的总消耗。

算法步骤

1.	初始化:
•	将起点加入到开放列表(open list)中,并初始化其G、H和F值。
•	开放列表用于存储待检查的节点,关闭列表(closed list)用于存储已检查的节点。
2.	选择当前节点:
•	从开放列表中选择F值最小的节点作为当前节点。如果当前节点是终点,则搜索结束。
•	否则,将当前节点从开放列表移除并加入关闭列表。
3.	处理相邻节点:
•	对于当前节点的每个相邻节点,计算其G、H和F值:
•	如果相邻节点在关闭列表中,则跳过。
•	如果相邻节点不在开放列表中,则将其加入开放列表,并设置其父节点为当前节点。
•	如果相邻节点已经在开放列表中,但通过当前节点到达相邻节点的G值更小,则更新相邻节点的G值和父节点。
4.	重复步骤2和步骤3,直到找到终点或开放列表为空(表示无解)。

启发式函数

启发式函数H的选择非常重要,直接影响A*算法的性能。常用的启发式函数有:

•	曼哈顿距离:适用于棋盘格上的移动,不允许对角线移动。
•	欧几里得距离:适用于允许任意方向移动的情况。
•	切比雪夫距离:适用于允许八方向(包括对角线)移动的情况。

最短路算法总结

在这里插入图片描述

如何选用?

高要求:
在这里插入图片描述

这个过程中考虑点还是边看是稠密图还是稀疏图

低要求: 会个Floyd和朴素版本Bellman-Ford以及变种即可

  1. 多源就用Floyd-Warshall算法
  2. 单源就用(朴素版本Bellman-Ford算法 + 负权回路检测) 版本
    • 2.1 有限就用有限节点最短路径版本(朴素版本Bellman-Ford算法 + 负权回路检测 + 有限节点)版本

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

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

相关文章

模拟建造游戏:城市:天际线2(都市天际线2)中文免安装,解压即撸

《城市&#xff1a;天际线2》&#xff08;Cities: Skylines II&#xff09;是一款模拟经营游戏&#xff0c;由Colossal Order开发&#xff0c;Paradox Interactive发行。 下载地址&#xff1a;https://pan.quark.cn/s/84e69332ec3e 更多游戏&#xff1a;https://kdocs.cn/l/cuH…

vue3引入openlayers

安装ol包 OpenLayers作为 ol npm包提供&#xff0c;它提供了官方支持的API的所有模块。 官方地址&#xff1a;ol npm install ol模块和子模块约定 具有CamelCase名称的OpenLayers模块提供类作为默认导出&#xff0c;并且可能包含其他常量或函数作为命名导出&#xff1a; i…

HarmonyOS Next 省市区级联(三级联动)筛选框

效果图 完整代码 实例对象 export class ProvinceBean {id?: stringpid?: stringisSelect?: booleandeep?: objectextName?: stringchildren?: ProvinceBean[] }级联代码 import { MMKV } from tencent/mmkv/src/main/ets/utils/MMKV import { ProvinceBean } from ..…

MLIR的TOY教程学习笔记

MLIR TOY Language 文章目录 MLIR TOY Language如何编译该项目ch1: MLIR 前端IR解析ch2: 定义方言和算子 (ODS)1. 定义方言2. 定义OP3. OP相关操作4. 定义OP ODS (Operation Definition Specification)1. 基本定义2. 添加文档3. 验证OP4. 新增构造函数5. 定义打印OP的格式 ch3:…

【数据结构】:用Java实现链表

在 ArrayList 任意位置插入或者删除元素时&#xff0c;就需要将后序元素整体往前或者往后搬移&#xff0c;时间复杂度为 O(n)&#xff0c;效率比较低&#xff0c;因此 ArrayList 不适合做任意位置插入和删除比较多的场景。因此&#xff1a;java 集合中又引入了 LinkedList&…

电脑怎么恢复删除的文件?8个方法,简单搞定文件恢复!(强力推荐)

电脑怎么恢复删除的文件&#xff1f;随着如今几乎每个人都拥有或使用计算机&#xff0c;文件丢失和误删已成为我们在日常计算机使用中难以避免的问题之一。在我们使用计算机的过程中&#xff0c;经常会遇到各种问题&#xff0c;有些可以轻松解决&#xff0c;而有些可能需要专业…

键盘是如何使用中断机制的?当打印一串字符到显示屏上时发生了什么???

当在键盘上按下一个键时会进行一下操作&#xff1a; 1.当按下任意一个键时&#xff0c;键盘编码器监控会来判断按下的键是哪个 2.键盘控制器用将解码,将键盘的数据保存到键盘控制器里数据寄存器里面 3.此时发送一个中断请求给中断控制器&#xff0c;中断控制器获取到中断号发送…

Spring Security认证授权介绍

一、目标 真正控制系统权限的&#xff0c;需要引入专门的安全框架才行&#xff0c;所以&#xff0c;我们今天重点来学习Spring家族中的一员Spring Security安全框架。最终呢&#xff0c;我们会使用Spring Security框架来控制养老项目的后台管理系统 能够熟悉常见的权限控制的方…

释疑 803-(1)概述 精炼提纯版

目录 习题 1-01计算机网络可以向用户提供哪些服务? 1-02 试简述分组交换的要点。 1-03 试从多个方面比较电路交换、报文交换和分组交换的主要优缺点。 1-05 互联网基础结构的发展大致分为哪几个阶段?请指出这几个阶段最主要的特点。 1-06 简述互联网标准制定的几个阶段…

导航网站WP主题/WP黑格导航主题BlackCandy-简约酷黑色高逼格+焕然一新的UI设计

源码简介&#xff1a; 导航网站WP主题-WP黑格导航主题BlackCandy&#xff0c;它有着简约酷黑色高逼格&#xff0c;而且有焕然一新的UI设计。它是一个简约漂亮的 WordPress 自媒体主题。黑格网址导航主题&#xff0c;自适应电脑端和手机端。 BlackCandy-V2.0这次全新升级了&am…

Godot游戏制作 03世界构建1.0版

在game场景&#xff0c;删除StaticBody2D节点&#xff0c;添加TileMap节点 添加TileSet图块集 添加TileSet源 拖动图片到图块&#xff0c;自动创建图块 使用橡皮擦擦除。取消橡皮擦后按住Shift创建大型图块。 进入选择模式&#xff0c;TileMap选择绘制&#xff0c;选中图块后在…

什么是设备运维管理系统?有什么作用?(6款设备运维管理系统推荐)

一、什么是设备运维管理系统&#xff1f; 设备运维管理系统是一种集成了监控、管理、维护和优化设备性能的软件平台。它旨在通过自动化的手段&#xff0c;提高设备运行的可靠性和效率&#xff0c;降低运维成本&#xff0c;并优化资源利用。 设备运维管理系统能够实时监控设备…

Springboot 开发之 RestTemplate 简介

一、什么是RestTemplate RestTemplate 是Spring框架提供的一个用于应用中调用REST服务的类。它简化了与HTTP服务的通信&#xff0c;统一了RESTFul的标准&#xff0c;并封装了HTTP连接&#xff0c;我们只需要传入URL及其返回值类型即可。RestTemplate的设计原则与许多其他Sprin…

Web响应式设计———1、Grid布局

1、网格布局 Grid布局 流动网格布局是响应式设计的基础。它通过使用百分比而不是固定像素来定义网格和元素的宽度。这样&#xff0c;页面上的元素可以根据屏幕宽度自动调整大小&#xff0c;适应不同设备和分辨率。 <!DOCTYPE html> <html lang"en"> &l…

代码随想录算法训练营第23天| 39. 组合总和 ,40.组合总和II ,131.分割回文串

学习任务&#xff1a; 39. 组合总和 40.组合总和II 131.分割回文串 Leetcode39. 组合总和 难度&#xff1a;中等 | 相关标签&#xff1a;数组、回溯 题目&#xff1a; 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以…

阿里云公共DNS免费版自9月30日开始限速 企业或商业场景需使用付费版

本周阿里云发布公告对公共 DNS 免费版使用政策进行调整&#xff0c;免费版将从 2024 年 9 月 30 日开始按照请求源 IP 进行并发数限制&#xff0c;单个 IP 的请求数超过 20QPS、UDP/TCP 流量超过 2000bps 将触发限速策略。 阿里云称免费版的并发数限制并非采用固定的阈值&…

Android 15 适配整理——实践版

背景 谷歌发布Android 15后&#xff0c;国内的手机厂商迅速行动&#xff0c;开始了新系统的适配工作。小米、OPPO、vivo和联想等金标联盟成员联合发布了适配公告&#xff0c;督促APP开发者在2024年8月31日前完成适配工作&#xff0c;否则将面临搜索标签提示、应用降级、分机型…

MySQL数据库-库表操作

一、SQL语句基础 1.SQL简介 SQL&#xff1a;结构化查询语言&#xff08;Structured Query Language&#xff09;&#xff0c;在关系型数据库上执行数据操作、数据检索以及数据维护的标准语言。使用SQL语句&#xff0c;程序员和数据库管理员可以完成如下任务&#xff1a; &am…

Leetcode—426. 将二叉搜索树转化为排序的双向链表【中等】Plus

2024每日刷题&#xff08;148&#xff09; Leetcode—426. 将二叉搜索树转化为排序的双向链表 实现代码 /* // Definition for a Node. class Node { public:int val;Node* left;Node* right;Node() {}Node(int _val) {val _val;left NULL;right NULL;}Node(int _val, Nod…

开放式耳机怎么选购性价比高?五大好评不断的爆款分享

长期使用入耳式耳机的朋友应该都会有这种担忧&#xff0c;经常塞着耳朵听歌&#xff0c;耳机上的细菌得不到及时的清理&#xff0c;不够健康卫生&#xff0c;还有诱发耳部发炎感染的风险。而开放式耳机的出现恰好缓解了这种担忧。如果你也想知道开放式耳机是否真有网上宣传的那…