最短路径(Dijkstra)算法

2023-11-03

目录

一、Dijkstra算法

二、核心思路

三、步骤

四、代码


一、Dijkstra算法

迪杰斯特拉(Dijkstra)算法是由荷兰计算机科学家狄克斯特拉于1959年提出的。是寻找从一个顶点到其余各顶点的最短路径算法,可用来解决最短路径问题

二、核心思路

迪杰斯特拉算法采用贪心算法的策略,将所有顶点分为已标记点未标记点两个集合,从起始点开始,不断在未标记点中寻找距离起始点路径最短的顶点,并将其标记,直到所有顶点都被标记为止。

所以我们需要准备一个起始点到其他点最短距离的一张表,和一个挑选节点的表,如下

		//从headnode出发到所有点最小距离的表
		//key: 从headnode出发到达key的点
		//value: 从headnode出发到达key的最小距离
		unordered_map<Node*, int> distanceMap;

		//先放入头节点,头节点到头节点的距离为0,其他为解锁的节点距离为正无穷
		distanceMap.insert(make_pair(headnode, 0));

		//有一个记录节点的表,使用完一个节点之后放入表中不再使用
		set<Node*> selectNodes;

需要注意的一点是该方法不能处理带有负权边的图,下面我们举出一个实例并通过迪杰斯特拉方法对其进行求解。

 

三、步骤

1、选一个minNode

2、考察minNode的所有边,判断边的toNode节点是否在set表中

3、如果不在表中,说明该点未被考察过,更新最小距离

4、在表中判断distanceMap中到该点的距离和现在走的这条路到该点的距离谁小,然后更新

5、重复1-4,直到所有的点被set表锁住结束整个流程

图解:

 

 重复上述步骤最终可以得到A点到所有点的最短路径的一个表 

四、代码

//Dijkstra的经典写法,有改写堆的优化
class Solution
{
public:
	unordered_map<Node*, int> dijkstra(Node* headnode) {
		//从headnode出发到所有点最小距离的表
		//key: 从headnode出发到达key的点
		//value: 从headnode出发到达key的最小距离
		unordered_map<Node*, int> distanceMap;

		//先放入头节点,头节点到头节点的距离为0,其他为解锁的节点距离为正无穷
		distanceMap.insert(make_pair(headnode, 0));

		//有一个记录节点的表,使用完一个节点之后放入表中不再使用
		set<Node*> selectNodes;

		//拿距离headnode最近并且没有被锁住的点
		Node* minNode = getMinNodeAndUnSelect(distanceMap, selectNodes);

		//一直更新minNode,直到最后所有点都被锁住,minNode == nullptr,所以完成整个流程
		while (minNode != nullptr) {
			int distance = distanceMap[minNode];
			for (auto edges : minNode->edges) {
				Node* toNode = edges->to;
				if (!selectNodes.count(toNode)) {
					distanceMap.insert(make_pair(toNode, distance + edges->weight));
				}
				distanceMap.insert(make_pair(toNode, min(distanceMap[toNode], distance + edges->weight)));
			}
			selectNodes.insert(minNode);
			minNode = getMinNodeAndUnSelect(distanceMap, selectNodes);
		}
		return distanceMap;
	}

	//返回距离headnode最近并且没有被锁过的点
	Node* getMinNodeAndUnSelect(unordered_map<Node*, int> distance, set<Node*> touchNode) {
		Node* minNode = nullptr;
		int minDistance = INT_MAX;
		for (auto pair : distance) {
			Node* getNode = pair.first;
			int getDistance = pair.second;
			if (!touchNode.count(minNode) && getDistance < minDistance) {
				minNode = getNode;
				minDistance = getDistance;
			}
		}
		return minNode;
	}
};

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

最短路径(Dijkstra)算法 的相关文章

  • C++ 中的映射的多个键

    我有一个表 其中的条目是这样的 Row Column1 Column2 Column3 Column4 1 0X0A 1 2 A 2 0X0B 2 2 B 3 0x0C 3 2 C 现在我想使用映射 以便我可以使用第 1 列或第 2 列作为
  • 以编程方式最大化屏幕一半的窗口

    我想最大化屏幕左侧的随机窗口 我可以在我的代码中使用 Windows Aero 函数吗 这个窗口can像用鼠标一样最大化 我只想以编程方式做到这一点 I use C 我可以得到IntPtr窗户的 如果可能的话 不要伪造鼠标或键盘输入 这可以
  • jni.h:没有这样的文件或目录

    我一直在关注本教程 http www java tips org other api tips jni simple example of using the java native interface html 在第 5 步 我从 GCC
  • 在实体框架中附加集合

    使用实体框架 我可以使用附加单个对象 entity Attach 但是 我没有看到任何方法允许我将多个对象的集合 数组添加到实体 我必须循环遍历集合中的每个项目并调用entity Attach 每一次 是的 您必须循环遍历子集合并Attac
  • 从 C# 运行 32 位或 64 位 PowerShell

    我构建了一个执行 PowerShell 脚本的 32 位 NET DLL 我需要它能够以 64 位模式运行脚本and 32 bit 我已经知道如何使用命令行执行此操作 C Windows Sysnative cmd c powershell
  • 如何在 Visual C++ 中创建 ActiveX DLL

    是否有在 Visual Studio 2008 C 中创建 ActiveX DLL 的教程 参考 我有一个使用 DLLRegisterServer UnregisterServer 构建的 DLL 并且已注册 但我在弄清楚使用什么名称来引用
  • 使用 Opengl 绘制立方体 3D

    我想使用 OpenGL 绘制 3D 立方体这是我的代码如何纠正错误 float ver 8 3 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0
  • 无法打开作为链接添加的 configSource 文件

    在我的 MVC 应用程序中 我使用外部配置文件来保持干净的 web config 有些文件很常见 我将它们作为链接从一个位置添加到项目中 对于这些文件 我将 复制 选项设置为 始终复制 这些文件将被复制到目标文件夹 我会看到它们 但是当我尝
  • 为什么无法在 android 中包含 iostream?

    已安装 android ndk r7 并尝试编译 cpp 文件 include
  • 线程忙等待

    基本上 我需要忙着等待一些 html 出现在网页上 我创建了以下代码来忙等我 public void ExecuteBusyWaitThreads foreach Canidate canidate in allCanidates Thre
  • 推导具有两个以上参数的 std::function

    我想知道为什么std function http en cppreference com w cpp utility functional function只知道有两个参数的函数 我已经编写了一些运行良好的代码 但存在许多限制 欢迎任何反馈
  • 如何从函数调用事件处理程序?

    我有一个类 我从中调用一个函数ABC string st 带字符串参数 该函数定义在一个Form class Form1 我有一个列表视图 想要从函数中自动调用列表视图 mouse click 事件 我该如何做到这一点 您不能调用另一个类的
  • 哪个对缓存最友好?

    我试图很好地掌握面向数据的设计以及如何在考虑缓存的情况下进行最佳编程 基本上有两种情况我无法完全确定哪个更好以及为什么 是拥有一个对象向量更好 还是拥有对象原子数据的多个向量更好 A 对象向量示例 struct A GLsizei mInd
  • Excel 中的单元格“数字存储为文本”

    我有一个 C 程序 它获取旧报告的文本文件并映射到 Excel 工作表 但对于交易单元格 它输出为 数字存储为文本 这不允许 任何格式 我们想要显示 1 000 00 但它仅显示为 1000 有什么办法可以得到这种格式吗 这些列是余额和金额
  • 静态、非成员或静态非成员函数?

    每当我有一些 实用 方向的功能时 我最终都会想知道哪个选项是最好的 例如 在我正在工作的上下文中打印消息结构 自己的或外部的 一些编码 解码代码或一些有用的转换函数 我想到的选项是 1 辅助类 结构中的静态函数 struct helper
  • 重载解析:这如何不含糊不清?

    假设我们有这段代码 是从一个单独的问题复制的 namespace x void f class C void f using x f f lt 名字f在指定的行上明确指的是x f 至少根据 gcc 和 clang 为什么是x f优先于x C
  • 如何在 asp.net 中用空字符串替换字符串中的任何“/ \\ [ ] : | < > + = ; , ? *”字符

    我想用 asp net c 中的空字符串替换字符串中出现的任何以下字符 我正在尝试将其替换为 mystring contains mystring Replace 目前我正在按照上面的方法进行 有没有更干净的方法来做到这一点 感谢致敬 有很
  • 为什么IL代码中stloc.0后面有一个ldloc.0?

    我正在尝试通过编写小代码片段和检查编译的程序集来学习 CIL 所以我写了这个简单的 if 语句 public static void Main string args Int32 i Int32 Parse Console ReadLine
  • Eigen 如何沿特定维度连接矩阵?

    我有两个特征矩阵 我想将它们连接起来 就像在 matlab 中一样cat 0 A B eigen 有等价物吗 Thanks 您可以使用逗号初始值设定项语法 水平方向 MatrixXd C A rows A cols B cols C lt
  • 无法使用 openxml 在 PPT 报告中生成第二个表

    我有这个代码 我能够完美地生成带有文本数据的 pptx 报告 我在这份报告中还有 4 个表格 其中包含动态数据 我可以在 PPT 中生成一张表格 但无法生成多个表格 Requirement On the right I have 4 tab

随机推荐

  • 11.3外汇黄金价格投资策略、期货原油最新价格布局及指导

    黄金消息面与技术面解析 消息面 周二 11月2日 国际金价持稳 在通胀压力不断增加以及对经济增长放缓的担忧之际 市场参与者等待美联储本周政策会议结果 美国物价和薪资涨幅正处于数十年来的高位 本周可能让美联储官员面临挑战 分析师预计 在央行收
  • STM32串口烧写程序

    STM32烧写注意 1 必须使用串口1烧写 2 烧写 BOOT0置1 BOOT1置0 运行 BOOT0置0 BOOT1置任意 3 使用FLYMCU烧写软件 4 NRST引脚电路设计成悬空 按键按下 拉低 步骤 1 买一根 TTL串口线分别把
  • 全国各省、市、区(sql语句)

    文章目录 一 省份 数据表 二 市 数据表 注意 因为到县sql语句太多文章限字数上传不全 所以一半放到了另外的一篇文章上 三 上部分区 县 数据表 四 中部分区 县 数据表 五 下部分区 县 数据表 六 在在下部分区 县 数据表 返回项目
  • 股票分析,利用线性回归实时预测股价,只需要提供股票代码即可爬取相应股票数据并建模

    这里参考了别人的代码 并引用了tushare模块中定义的接口自动获取了依据 股票代码来获取数据 此篇文章提供了 1 一个简单通过接口爬取csv数据的方法 2 一个处理csv数据的简单方法 3 依据数据进行特征提取建立简单的股价预测模型 如下
  • 关于Pygame运行无响应问题的办法(已解决)

    目录 pygame程序运行时需要初始化 在关闭运行页面的时候无响应 pygame程序运行时需要初始化 如下代码运行后无反应 import sys import pygame size width height 600 400 screen
  • 华为机试2016

    编程题 最高分是多少 老师想知道从某某同学当中 分数最高的是多少 现在请你编程模拟老师的询问 当然 老师有时候需要更新某位同学的成绩 输入描述 输入包括多组测试数据 每组输入第一行是两个正整数N和M 0 lt N lt 30000 0 lt
  • 1.5.1 AlexNet

    目录 五 AlexNet 5 1 ReLU 激活函数 5 2 局部响应正则化 5 3 数据增强 5 4 Dropout 5 5 网络整体架构 5 6 小结 五 AlexNet AlexNet 是 2012 年第 3届 ILSVRC Imag
  • 【postgresql 基础入门】创建数据库的方法,存储位置,决定自己的数据的访问用户和范围

    创建数据库 专栏内容 postgresql内核源码分析 手写数据库toadb 并发编程 开源贡献 toadb开源库 个人主页 我的主页 管理社区 开源数据库 座右铭 天行健 君子以自强不息 地势坤 君子以厚德载物 系列文章 入门准备 pos
  • Qt

    Qt QListWidgetItem返回错误的背景颜色 始终返回颜色值为0 问题解决 使用场景 程序使用QListWidget显示一个列表 这个列表具有点击选择和再次点击取消选择的功能 点击之后需要更换背景色以表示被选中 由于软件有主题效果
  • Js动态加载CSS样式文件的2种方法

    动态加载CSS文件 这个时常会用到 一般搞前端 我们最先想到的就是用JS来实现 的确 JS可以很方便的控制CSS样式表文件的动态插入 以下两种方法 使用 一 使用 这点采用了YUI插件中的一个方法 有效解决了各大浏览器的兼容性问题 主要是使
  • 面试经典(25)--二叉查找树(搜索树)

    二叉搜索树是经典的数据结构 本文来总结一下二叉搜索树的插入和删除算法 插入算法 struct Node int key struct Node parent struct Node left struct Node right struct
  • Elasticsearch实战(三)---复杂数据结构及映射 Mapping操作

    Elasticsearch实战 复杂数据结构及映射 Mapping操作 文章目录 Elasticsearch实战 复杂数据结构及映射 Mapping操作 1 ElasticSearch 映射操作 1 1 结构 1 2 映射 1 3 映射 显
  • CentOS8安装keepalived和lvs遇到的坑

    CentOS8 最小化安装 关闭selinux 两个负载yum 安装keepalived 和ipvsadm 一 没有配置ip forward lvs用DR模式不用 二 没有配置虚拟IP 只在keepalived配置中写的 前期是没有会配置虚
  • Java七大设计原则 - 接口隔离原则

    一 什么是 接口隔离原则 Interface Segregation Principle 原则含义 一个类对于另外一个类的依赖应该建立在最小的接口上 1 接口隔离原则 实际上它是建立在另一种设计原则之上 依赖倒置 的 即 面向接口编程 而
  • 【C++】C++封装成DLL并调用(初学者快速入门)

    话不多说 干货走起 侵删 使用vs2019将C 封装成DLL并调用主要有以下几个步骤 1 新建工程 编写要封装的 cpp和 h文件 2 生成动态链接库 dll和静态链接库 lib 3 调用通过 h文件调用 第一步 编写 cpp和 h文件 本
  • Linux中vi的用法

    vi 有三种工作模式 普通模式 1 输入模式 2 命令模式 3 末行模式 ese 退出到普通模式 输入模式 a 光标处的后面切换到输入 A 光标跳转到当前行的最末端 i 光标处的前面输入 I 光标跳到当前行的最前端 r 替换光标处的一字母
  • 判断一个字符串中各个字符出现的次数

    我这里使用了两种方法 两种方法思路差不多 但是使用处理字符串的方法不一样 所以执行效率不一样 long xxx System nanoTime 这个方法用来标记执行方法前后的时间点 看最终执行完所用时间 纳秒 第一种方法效率高 时间快 不是
  • 基于Matlab GUI的形态学方法进行水果大小识别

    基于Matlab GUI的形态学方法进行水果大小识别 在本文中 我们将探讨如何使用Matlab的图形用户界面 GUI 和形态学方法来进行水果大小的识别 形态学是一种图像处理技术 主要用于提取和改善图像中的形状和结构信息 我们将使用Matla
  • YOLOX训练代码分析1-COCO与VOC训练

    1 YOLOX的网络结构图与代码YOLOv3 YOLOv4 YOLOv5 YOLOx的网络结构图 清晰版 YMilton的专栏 CSDN博客 https blog csdn net YMilton article details 12026
  • 最短路径(Dijkstra)算法

    目录 一 Dijkstra算法 二 核心思路 三 步骤 四 代码 一 Dijkstra算法 迪杰斯特拉 Dijkstra 算法是由荷兰计算机科学家狄克斯特拉于1959年提出的 是寻找从一个顶点到其余各顶点的最短路径算法 可用来解决最短路径问