路径规划(二):Dijkstra算法

Dijkstra算法

  • 一、概述
  • 二、Dijkstra算法步骤
  • 三、相关代码

一、概述

  Dijkstra算法是一种用于找到图中最短路径的算法

二、Dijkstra算法步骤

Dijkstra算法是一种用于求解带权图中单源最短路径的算法。以下是Dijkstra算法的步骤:

  1. 初始化:创建两个数组,一个用于记录每个节点的最短路径长度(dist数组),初始值为无穷大,另一个用于判断节点是否已经被访问(visited数组),初始值为未访问。

  2. 设置起点:将起点的最短路径长度设置为0,并将其标记为已访问。

  3. 更新最短路径:对于起点的所有邻接节点,计算通过起点到达该节点的路径长度,并更新dist数组中的最短路径长度。

  4. 选择最短路径节点:从未访问的节点中选择一个最短路径长度最小的节点,并将其标记为已访问。

  5. 更新其它节点的最短路径:对于刚被访问的节点的邻接节点,计算通过刚被访问的节点到达该邻接节点的路径长度,并更新dist数组中的最短路径长度。

  6. 重复步骤4和5,直到所有节点都被访问。

  7. 最短路径获取:根据dist数组中的最短路径长度,可以得到从起点到其他节点的最短路径。

三、相关代码

下面是用C语言编写的Dijkstra算法的代码示例:

#include <stdio.h>
#include <stdbool.h>// 定义无穷大的值
#define INFINITE 9999
#define MAX_NODES 10// 计算最短路径
void dijkstra(int graph[MAX_NODES][MAX_NODES], int start, int dist[MAX_NODES], bool visited[MAX_NODES]) {// 初始化dist数组和visited数组for (int i = 0; i < MAX_NODES; i++) {dist[i] = INFINITE;visited[i] = false;}// 设置起点的最短路径长度为0dist[start] = 0;// 寻找最短路径for (int count = 0; count < MAX_NODES - 1; count++) {int minDist = INFINITE;int minDistNode = -1;// 选择最短路径长度最小的节点for (int i = 0; i < MAX_NODES; i++) {if (!visited[i] && dist[i] < minDist) {minDist = dist[i];minDistNode = i;}}// 标记该节点为已访问visited[minDistNode] = true;// 更新其他节点的最短路径长度for (int i = 0; i < MAX_NODES; i++) {if (!visited[i] && graph[minDistNode][i] && dist[minDistNode] != INFINITE &&dist[minDistNode] + graph[minDistNode][i] < dist[i]) {dist[i] = dist[minDistNode] + graph[minDistNode][i];}}}
}int main() {int graph[MAX_NODES][MAX_NODES] = {{0, 4, 0, 0, 0, 0, 0, 8, 0},{4, 0, 8, 0, 0, 0, 0, 11, 0},{0, 8, 0, 7, 0, 4, 0, 0, 2},{0, 0, 7, 0, 9, 14, 0, 0, 0},{0, 0, 0, 9, 0, 10, 0, 0, 0},{0, 0, 4, 14, 10, 0, 2, 0, 0},{0, 0, 0, 0, 0, 2, 0, 1, 6},{8, 11, 0, 0, 0, 0, 1, 0, 7},{0, 0, 2, 0, 0, 0, 6, 7, 0}};int start = 0;int dist[MAX_NODES];bool visited[MAX_NODES];dijkstra(graph, start, dist, visited);printf("节点\t最短路径长度\n");for (int i = 0; i < MAX_NODES; i++) {printf("%d\t%d\n", i, dist[i]);}return 0;
}

以上代码实现了Dijkstra算法的功能,可以计算带有权值的图中从起点到其他节点的最短路径长度。输入的图使用邻接矩阵表示,其中无连接的两个节点之间的距离为0。输出结果为每个节点的最短路径长度。

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

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

相关文章

CTF-PWN-栈溢出-中级ROP-【栈迁移】

文章目录 栈迁移具体流程 VNCTF 2023 traveler libc-2.27检查源码main函数![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/386c35c30f854434ae43667b9473c58a.png)全局变量地址局部变量地址 PIE保护开启PIE关闭PIE 思路exp 栈迁移参考 栈迁移参考 栈迁移 顾名思义…

【技能---pip install 换源加速】

文章目录 概要进行以下的操作其他常用源 概要 有时候安装某个库特别的慢、耗时&#xff01;&#xff01;&#xff01;&#xff01; 例如&#xff1a; pip install opencv-python这个时候会占用大把的时间。。。。。 进行以下的操作 pip install 包名 -i 源地址 例如&#x…

HCIA-Datacom题库(自己整理分类的)_15_VRP平台多选【9道题】

1.VRP操作平台存在哪些命令行视图? 用户视图 接口视图 协议视图 系统视图 2.以下哪些存储介质是华为路由器常用的存储介质 SDRAM NVRAM Flash Hard Disk SD Card 解析&#xff1a;Hard Disk是硬盘&#xff0c;一般网络设备没有。 3.VRP支持通过哪几种方式对路由器…

C#操作注册表

说明 今天用C#开发了一个简单的服务&#xff0c;需要设置成为自启动&#xff0c;网上有很多方法&#xff0c;放到启动运行等&#xff0c;但是今天想介绍一个&#xff0c;通过修改注册表实现&#xff0c;同时介绍一下操作注册表。 private void TestReg(){//仅对当前用户有效 H…

分析一个项目(微信小程序篇)二

目录 首页&#xff1a; 发现&#xff1a; 购物车&#xff1a; 我的&#xff1a; 分析一个项目讲究的是如何进行对项目的解析分解&#xff0c;进一步了解项目的整体结构&#xff0c;熟悉项目的结构&#xff0c;能够知道每个组件所处在哪个位置&#xff0c;发挥什么作用。 接…

基于Springboot的计算机学院校友网(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的计算机学院校友网(有报告)。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring…

密码学(二)

文章目录 前言一、Certificate Authorities二、Key Agreement Protocols 前言 本文来自 Intel SGX Explained 请参考&#xff1a;密码学&#xff08;一&#xff09; 一、Certificate Authorities 非对称密钥密码学中的公钥和私钥假设每个参与方都拥有其他参与方的正确公钥。…

【JAVA】Java8开始ConcurrentHashMap,为什么舍弃分段锁

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; JAVA ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 分段锁的好处&#xff1a; 结语 我的其他博客 前言 在Java 8中&#xff0c;ConcurrentHashMap的实现经历了重大的改进&am…

在Ubuntu中检查内存的五个命令,总有一种适合你

序言 作为Ubuntu用户,尤其是管理员,我们需要检查系统使用了多少内存资源,以及有多少是可用的。我们还知道,大多数管理任务最好从Linux命令行完成,而不是从图形用户界面完成。例如,服务器通常在shell上工作,没有图形用户界面。由于控制服务器上的内存资源是最重要的,因…

Linux 如何 kill 指定的 python 进程

文章目录 写在前面一、显示python相关的进程二、找到自己想要 kill 的进程&#xff0c;执行下述指令 写在前面 自己的系统是 Ubuntu 20.04 一、显示python相关的进程 ps -ef | grep python显示结果如下 其中&#xff0c;第二列分别是各个进程的 PID 号。 二、找到自己想要…

facebook广告对于推广的重要性

广告覆盖广泛&#xff1a; Facebook是全球最大的社交媒体平台之一&#xff0c;拥有数十亿的用户。通过在Facebook上投放广告&#xff0c;广告主可以覆盖到大量潜在客户&#xff0c;提高品牌曝光度。 精准定位和定向广告&#xff1a; Facebook提供了强大的广告定位和定向功能&a…

oracle的SYSAUX表空间满了怎么处理

清理SYSAUX表空间&#xff1a; 创建临时表&#xff0c;保存近8天的数据 create table test.ash_bak_20220119 as select * from sys.WRH$_ACTIVE_SESSION_HISTORY where SAMPLE_TIME>sysdate-9; SQL> select count(*) from test.ash_bak_20220119;COUNT(*) ----------…

python 基础笔记

基本数据类型 函数 lamda 匿名函数 成员方法 类 类与对象 构造方法 魔术方法 私有成员 私有方法 继承 注解 变量注解 函数注解 Union类型 多态 参考链接&#xff1a;黑马程序员python教程&#xff0c;8天python从入门到精通&#xff0c;学python看这套就够了_哔哩哔哩_bilib…

【Azure 架构师学习笔记】- Azure Databricks (5) - Unity Catalog 简介

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Databricks】系列。 接上文 【Azure 架构师学习笔记】- Azure Databricks (4) - 使用Azure Key Vault 管理ADB Secret 前言 DataBricks Unity Catalog&#xff08;UC&#xff09;是一个统一的对数据资产治理的解决方案…

C# 一看就懂的装箱拆箱案例

文章目录 装箱&#xff08;Boxing&#xff09;拆箱&#xff08;Unboxing&#xff09;编程语言中的装箱与拆箱优缺点 在C#中&#xff0c;装箱&#xff08;Boxing&#xff09;和拆箱&#xff08;Unboxing&#xff09;是值类型与引用类型之间相互转换的过程。 装箱&#xff08;Box…

C++推箱子游戏开发

游戏 自动地图生成背景音乐推箱子到目标位置 美工资源 美工资源&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1MZv8pDBXdNDbXxuAAPSM-A **提取码&#xff1a;**2syq 图形库: www.easyx.cn cpp文件 #include "box_man.h" #include <conio.h> #…

Java实现基于GDAL将单波段影像转为三波段影像-唯一值渲染

在处理遥感影像的渲染时&#xff0c;经常需要处理单波段影像。单波段影像没有任何颜色&#xff0c;只有一个波段的值。渲染时只能采用色带拉伸、离散颜色、唯一值渲染这几种方式。直接将单波段影像转成三波段的影像&#xff0c;并将三个波段转为颜色对应的rgb值&#xff0c;这样…

C++ 中关键字 Static

1、什么是static? static 是C中很常用的修饰符&#xff0c;它被用来控制变量的存储方式和可见性。由关键字static修饰类中成员&#xff0c;成为类的静态成员。类的静态成员为其所有对象共享&#xff0c;不管有多少对象&#xff0c;静态成员只有一份存于公用内存中。静态…

2023高级人工智能期末总结

1、人工智能概念的一般描述 人工智能是那些与人的思维相关的活动&#xff0c;诸如决策、问题求解和学习等的自动化&#xff1b; 人工智能是一种计算机能够思维&#xff0c;使机器具有智力的激动人心的新尝试&#xff1b; 人工智能是研究如何让计算机做现阶段只有人才能做得好的…

接口自动化测试要做什么?

作者&#xff1a;不辣的皮皮 链接&#xff1a;https://www.zhihu.com/question/384727359/answer/1124441469 来源&#xff1a;知乎 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 可以分为四个步骤/阶段。 原理 》 业务逻辑》 工具》 …