Bellman-Ford 和 SPFA 算法的实现DEM路径搜索

首先,假设你已经有一个 2D 数组表示 DEM 数据,每个元素的值表示某个位置的高度。你可以根据特定的规则来决定哪些区域是障碍物或无效值。

  1. Bellman-Ford 算法的实现
#include <iostream>
#include <vector>
#include <climits>
#include <queue>using namespace std;// 定义一个邻接列表表示图
struct Edge {int u, v, weight;
};class BellmanFord {
public:BellmanFord(int n) : V(n), dist(n, INT_MAX) {}void addEdge(int u, int v, int weight) {edges.push_back({u, v, weight});}// Bellman-Ford算法求最短路径void run(int start) {dist[start] = 0;// 放松所有边 V-1 次for (int i = 0; i < V - 1; ++i) {for (auto& edge : edges) {if (dist[edge.u] != INT_MAX && dist[edge.u] + edge.weight < dist[edge.v]) {dist[edge.v] = dist[edge.u] + edge.weight;}}}// 检查负权环for (auto& edge : edges) {if (dist[edge.u] != INT_MAX && dist[edge.u] + edge.weight < dist[edge.v]) {cout << "Negative weight cycle detected!" << endl;return;}}}int getDistance(int vertex) {return dist[vertex];}private:int V;vector<Edge> edges;vector<int> dist;
};int main() {int V = 5; // 假设图中有5个节点BellmanFord bf(V);// 示例: 添加一些边bf.addEdge(0, 1, 10);bf.addEdge(0, 2, 5);bf.addEdge(1, 2, 2);bf.addEdge(1, 3, 1);bf.addEdge(2, 1, 3);bf.addEdge(2, 3, 9);bf.addEdge(3, 4, 4);int start = 0;  // 指定起点bf.run(start);// 输出从起点到每个点的最短距离for (int i = 0; i < V; ++i) {cout << "Distance from " << start << " to " << i << ": " << bf.getDistance(i) << endl;}return 0;
}
  1. SPFA (Shortest Path Faster Algorithm) 算法的实现
#include <iostream>
#include <vector>
#include <climits>
#include <queue>using namespace std;class SPFA {
public:SPFA(int n) : V(n), dist(n, INT_MAX), inQueue(n, false) {}void addEdge(int u, int v, int weight) {adj[u].push_back({v, weight});}void run(int start) {dist[start] = 0;queue<int> q;q.push(start);inQueue[start] = true;while (!q.empty()) {int u = q.front();q.pop();inQueue[u] = false;for (auto& edge : adj[u]) {int v = edge.first, weight = edge.second;if (dist[u] + weight < dist[v]) {dist[v] = dist[u] + weight;if (!inQueue[v]) {q.push(v);inQueue[v] = true;}}}}}int getDistance(int vertex) {return dist[vertex];}private:int V;vector<vector<pair<int, int>>> adj;  // 邻接表,存储边(目标节点,边的权重)vector<int> dist;vector<bool> inQueue;  // 判断节点是否已经在队列中
};int main() {int V = 5;  // 假设图中有5个节点SPFA spfa(V);// 示例: 添加一些边spfa.addEdge(0, 1, 10);spfa.addEdge(0, 2, 5);spfa.addEdge(1, 2, 2);spfa.addEdge(1, 3, 1);spfa.addEdge(2, 1, 3);spfa.addEdge(2, 3, 9);spfa.addEdge(3, 4, 4);int start = 0;  // 指定起点spfa.run(start);// 输出从起点到每个点的最短距离for (int i = 0; i < V; ++i) {cout << "Distance from " << start << " to " << i << ": " << spfa.getDistance(i) << endl;}return 0;
}
  1. 处理 DEM 数据和障碍物
    你可以将 DEM 数据表示为一个二维数组,每个位置的值是该位置的高度。假设高度低于某个阈值的区域表示障碍物或无效值。

#include <iostream>
#include <vector>using namespace std;bool isObstacle(int height, int threshold) {return height <= threshold;
}void buildGraphFromDEM(const vector<vector<int>>& dem, int threshold, SPFA& spfa) {int rows = dem.size();int cols = dem[0].size();// 邻接表构建for (int i = 0; i < rows; ++i) {for (int j = 0; j < cols; ++j) {if (isObstacle(dem[i][j], threshold)) {continue;  // 如果是障碍物或无效值,则跳过}// 将四个方向的邻接节点添加到图中if (i > 0 && !isObstacle(dem[i - 1][j], threshold)) {  // 上spfa.addEdge(i * cols + j, (i - 1) * cols + j, 1);}if (i < rows - 1 && !isObstacle(dem[i + 1][j], threshold)) {  // 下spfa.addEdge(i * cols + j, (i + 1) * cols + j, 1);}if (j > 0 && !isObstacle(dem[i][j - 1], threshold)) {  // 左spfa.addEdge(i * cols + j, i * cols + (j - 1), 1);}if (j < cols - 1 && !isObstacle(dem[i][j + 1], threshold)) {  // 右spfa.addEdge(i * cols + j, i * cols + (j + 1), 1);}}}
}int main() {vector<vector<int>> dem = {{1, 1, 1, 0, 1},{1, 0, 1, 1, 1},{1, 1, 0, 1, 0},{1, 1, 1, 1, 1}};int threshold = 0;  // 假设 0 以下为障碍物int V = dem.size() * dem[0].size();SPFA spfa(V);buildGraphFromDEM(dem, threshold, spfa);int start = 0;  // 从 (0, 0) 点出发spfa.run(start);// 输出从起点到目标点的最短距离int target = 4;  // 比如目标点为 (0, 4)cout << "Distance from start to target: " << spfa.getDistance(target) << endl;return 0;
}

代码解释:
Bellman-Ford 算法:该算法是用于解决单源最短路径问题的经典算法。它逐步放松所有的边
𝑉

1
V−1 次,适用于带负权边的情况。
SPFA 算法:SPFA 是一种基于队列的改进算法,它在大多数情况下比 Bellman-Ford 快。
DEM 数据处理:通过 isObstacle 函数判断高度是否低于给定的阈值,从而判断是否为障碍物。如果是障碍物,则不添加边。
运行:
程序会自动过滤掉无效区域(障碍物)并计算从起点到终点的最短路径。
可以通过修改 dem 和 threshold 来适配不同的地图和障碍物条件。
如果你有特定的数据或者需要进一步的功能扩展,随时告诉我!

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

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

相关文章

红外相机和RGB相机外参标定 - 无需标定板方案

1. 动机 在之前的文章中红外相机和RGB相机标定&#xff1a;实现两种模态数据融合_红外相机标定-CSDN博客 &#xff0c;介绍了如何利用标定板实现外参标定&#xff1b;但实测下来发现2个问题&#xff1a; &#xff08;1&#xff09;红外标定板尺寸问题&#xff0c;由于标定板小…

web小:在html页面实现多边形按钮

效果如下图所示 主要是使用了clip-path&#xff0c;代码如下 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0">&l…

【蓝桥杯C/C++】翻转游戏:多种实现与解法解析

文章目录 &#x1f4af;题目&#x1f4af;问题分析解法一&#xff1a;减法法解法二&#xff1a;位运算解法解法三&#xff1a;逻辑非解法解法四&#xff1a;条件运算符解法解法五&#xff1a;数组映射法不同解法的比较 &#x1f4af;小结 &#x1f4af;题目 在蓝桥镇&#xff0…

V-rep机器人仿真软件学习笔记

常用的机器人仿真软件有哪些&#xff1f;为什么选择V-rep&#xff1f; 目前常用的机器人物理仿真软件有Gazebo、V-rep、Webots等&#xff0c;这三款都是开源软件&#xff0c;自己使用过前两种&#xff0c;Gazebo配合ROS使用功能十分强大&#xff0c;但是要在Linux系统下使用&am…

第7章 硬件测试-7.1 硬件调试

第7章 硬件测试 7.1 硬件调试7.1.1 电路检查7.1.2 电源调试7.1.3 时钟调试7.1.4 主芯片及外围小系统调试7.1.5 存储器件和串口外设调试7.1.6 其他功能模块调试 测试是每项成功产品的必经环节。硬件测试是评估产品质量的重要方法&#xff0c;产品质量是公司的信誉和品牌象征&…

《深入理解 Spring MVC 工作流程》

一、Spring MVC 架构概述 Spring MVC 是一个基于 Java 的轻量级 Web 应用框架&#xff0c;它遵循了经典的 MVC&#xff08;Model-View-Controller&#xff09;设计模式&#xff0c;将请求、响应和业务逻辑分离&#xff0c;从而构建出灵活可维护的 Web 应用程序。 在 Spring MV…

基于Java Springboot宿舍管理系统

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据…

LeetCode螺旋矩阵

快一个月没刷题了&#xff0c;最近工作有些忙&#xff0c;今天闲下来两小时&#xff0c;刷一道 题目描述 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4…

探索CompletableFuture:高效异步编程的利器

目录 一、CompletableFuture基本功能安利 二、CompletableFuture使用介绍 &#xff08;一&#xff09;任务创建使用 1.supplyAsync创建带有返回值的异步任务 2.runAsync创建没有返回值的异步任务 &#xff08;二&#xff09;异步回调使用 1.异步回调&#xff1a;thenApp…

java的强,软,弱,虚引用介绍以及应用

写在前面 本文看下Java的强&#xff0c;软&#xff0c;弱&#xff0c;虚引用相关内容。 1&#xff1a;各种引用介绍 顶层类是java.lang.ref.Reference,注意是一个抽象类&#xff0c;而不是接口&#xff0c;其中比较重要的引用队列ReferenceQueue就在该类中定义&#xff0c;子…

基于STM32的智能垃圾分类投递系统设计

目录 引言系统需求与设计目标硬件设计 3.1 核心控制模块 3.2 传感器模块 3.3 驱动模块 3.4 显示模块 3.5 通信模块软件设计 4.1 数据采集与处理 4.2 垃圾分类逻辑实现 4.3 状态显示与远程监控代码实现 5.1 数据采集与处理 5.2 分类逻辑与控制 5.3 状态显示与通信 5.4 主程序实…

手摸手6-创建前端应用

目录 手摸手6-创建前端应用简介命令 npm create vue 和 npm init vue3的区别 使用 Create-Vue 创建应用1、输入命令 npm create vue 创建应用2、输入命令 npm install 安装相关依赖3、输入命令 npm run dev 运行项目 项目结构 手摸手6-创建前端应用 简介 create-vue 是 vue 应…

第T8周:Tensorflow实现猫狗识别(1)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 具体实现 &#xff08;一&#xff09;环境 语言环境&#xff1a;Python 3.10 编 译 器: PyCharm 框 架: &#xff08;二&#xff09;具体步骤 from absl.l…

【MySQL】数据库基础

1.数据库基本认识 广义上来说数据库是长期存储在磁盘上的数据文件的集合&#xff0c;而MySQL是采用了C/S模式实现的一个网络服务&#xff0c;它由MySQL&#xff08;数据库客户端&#xff09; 、MySQLD &#xff08;数据库服务&#xff09;、磁盘上的数据库文件组成。MySQL服务是…

AWS IAM

一、介绍 1、简介 AWS Identity and Access Management (IAM) 是 Amazon Web Services 提供的一项服务&#xff0c;用于管理 AWS 资源的访问权限。通过 IAM&#xff0c;可以安全地控制用户、组和角色对 AWS 服务和资源的访问权限。IAM 是 AWS 安全模型的核心组成部分&#xf…

windows C#-异步编程场景(二)

等待多个任务完成 你可能发现自己处于需要并行检索多个数据部分的情况。 Task API 包含两种方法(即 Task.WhenAll 和 Task.WhenAny)&#xff0c;这些方法允许你编写在多个后台作业中执行非阻止等待的异步代码。 此示例演示如何为一组 User 捕捉 userId 数据。 private stati…

web——sqliabs靶场——第九关——时间盲注

什么是时间盲注 时间盲注是指基于时间的盲注&#xff0c;也叫延时注入&#xff0c;根据页面的响应时间来判断是否存在注入。 使用sqlmap不同的技术 sqlmap --technique 参数用来设置具体SQL注入技术 B: Boolean-based blind 基于布尔的忙逐步 E:Error-based 报错注入 U&am…

Vue所有图片预加载加上Token请求头信息、图片请求加载鉴权

环境 Vue2、“axios”: “0.18.1”、webpack&#xff1a;“4.46.0”、ant-design-vue: “1.7.8” 描述 项目对安全要求比较高&#xff0c;所有后台返回的图片加载时都要加上token。比如资源图片&#xff0c;拍照打卡的图片&#xff0c;都需要鉴权。如果不带上token参数&…

此电脑中的百度网盘图标无法删除解决方法2024/11/18

教程很详细&#xff0c;直接上步骤 对于这种情况&#xff0c;修改注册表是很麻烦的&#xff0c;眨眼睛在这里推荐这位大佬的开源软件MyComputerManager 点击跳转MyComputerManager下载链接

【模型级联】YOLO-World与SAM2通过文本实现指定目标的零样本分割

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…