当前位置: 首页 > news >正文

图的最短路径:Dijkstra算法和Bellman-Ford算法(C++)

上文中我们了解了拓扑排序, 本节我们来学习最短路径的算法.

在图论中, 最短路径问题是指在一个加权图中找到两个节点之间的权重和最小的路径.

最短路径问题是一个基础且重要的主题. 它不仅在理论上具有挑战性, 而且在实际应用中也非常广泛, 比如交通导航, 社交网络分析等. 本文将介绍几种解决最短路径问题的经典算法, 并讨论它们的应用场景.

环境要求

本文所用样例在Windows 11以及Ubuntu 24.04上面编译通过.

  1. Windows: 使用[Visual Studio],
  2. Ubuntu: 使用 Clang 18.1.3. (Ubuntu 24.04 系统安装版本)
  3. GCC 无法编译直接本项目代码, 因为本文代码使用了 C++20 Module, 而 GCC 对此支持不完整.

关于 Module 的更多信息, 请参考我之前的博客: CMake 构建 C++20 Module 实例(使用 MSVC)

本项目工程目录: 图论代码


1. Dijkstra 算法

Dijkstra 算法是由荷兰计算机科学家艾兹赫尔·戴克斯特拉(Edsger W. Dijkstra)于 1956 年提出的一种用于解决加权图中单源最短路径问题的算法. 该算法适用于所有边权重为非负数的情况, 能够找到从一个起点到图中所有其他顶点的最短路径.

核心思想

Dijkstra 算法基于贪心策略, 其核心思想是: 每次从未确定的节点集合中选择距离起点最近的节点作为当前处理对象, 并更新通过该节点到达其他节点的距离估计值. 重复此过程直到所有节点都被处理过, 或者找到了目标节点.

算法步骤

以下是 Dijkstra 算法的基本步骤:

  1. 初始化:

    • 将起始节点的距离设为 0, 其余所有节点的距离设为无穷大.
    • 创建一个优先队列(或最小堆), 将所有节点加入其中, 起始节点的优先级最高(即距离最小).
  2. 主循环:

    • 从优先队列中取出距离最小的节点 u.
    • 对于节点 u 的每一个邻居 v:
      • 计算从起始节点经过 u 到达 v 的距离 d = 距离[u] + 权重(u, v).
      • 如果 d 小于当前记录的 v 的距离, 则更新 v 的距离, 并设置 v 的前驱节点为 u.
      • 更新优先队列中的 v 节点信息(如果使用的是优先队列).
  3. 终止条件:

    • 当优先队列为空时, 算法结束.
    • 或者在找到特定的目标节点后提前终止.

示例

假设我们有一个如下所示的简单无向图:

sample

如果我们想找出从 A 到 F 的最短路径, 按照 Dijkstra 算法步骤执行如下:

  1. 初始化: dist[A]=0, dist[B]=dist[C]=dist[D]=dist[E]=dist[F]=dist[G]=dist[H]=dist[M]= ∞ \infty .
    dj0

  2. 主循环:

    • 取出 A, 更新 BD 的距离为 3 和 4. 下一个要弹出的元素是 B.
      dj1
    • 取出 B, 更新 CE 的距离为 6 和 5. 下一个要弹出的元素是 D.
      dj2
    • 取出 D, 更新 GH 的距离为 6 和 7. 下一个要弹出的元素是 E.
      dj3
    • 取出 E, 更新 FM 的距离为 8 和 10. 因为已经到达M, 所以算法结束. 最短距离为 10.
      dj4

时间复杂度

使用优先队列优化的版本时间复杂度为 O ( ( V + E ) log ⁡ ( V ) ) O((V+E)\log(V)) O((V+E)log(V)), 其中 V V V 是顶点数量, E E E 是边的数量.

代码实现

void dijkstra() {auto cmp = [](const auto& lhs, const auto& rhs) {return lhs.second > rhs.second;};std::priority_queue<std::pai

相关文章:

图的最短路径:Dijkstra算法和Bellman-Ford算法(C++)

上文中我们了解了拓扑排序, 本节我们来学习最短路径的算法. 在图论中, 最短路径问题是指在一个加权图中找到两个节点之间的权重和最小的路径. 最短路径问题是一个基础且重要的主题. 它不仅在理论上具有挑战性, 而且在实际应用中也非常广泛, 比如交通导航, 社交网络分析等. 本…...

【WebGL】fbo双pass案例

双pass渲染案例&#xff08;离线渲染一个三角面&#xff0c;然后渲染到一个占满屏幕的矩阵上&#xff09; 离线渲染如何需要开启深度测试的话&#xff0c;需要额外操作&#xff0c;这里不展开 <!DOCTYPE html> <html lang"en"><head><meta ch…...

【机器学习】CNN与Transformer的表面区别与本质区别

仅供参考 表面区别 1. 结构和原理: CNN:主要通过卷积层来提取特征,这些层通过滑动窗口(卷积核)捕捉局部特征,并通过池化层(如最大池化)来降低特征的空间维度。CNN非常适合处理具有网格状拓扑结构的数据,如图像。Transformer:基于自注意力(Self-Attention)机制,能…...

C++:pthread的使用

pthread 简介 pthread 是 POSIX 线程&#xff08;POSIX Threads&#xff09;的简称&#xff0c;它是 POSIX 标准中定义的线程接口规范。pthread 库提供了一系列函数&#xff0c;用于创建、销毁、同步和管理线程。在类 Unix 系统&#xff08;如 Linux、macOS&#xff09;中&…...

Docker 容器安装 Dify的两种方法

若 Windows 已安装 Docker&#xff0c;可借助 Docker 容器来安装 Dify&#xff1a; 一、方法一 1. 拉取 Dify 镜像 打开 PowerShell 或命令提示符&#xff08;CMD&#xff09;&#xff0c;运行以下命令从 Docker Hub 拉取 Dify 的镜像&#xff08;Docker Hub中找到该命令行&…...

nodejs:express + js-mdict 作为后端,vue 3 + vite 作为前端,在线查询英汉词典

向 doubao.com/chat/ 提问&#xff1a; node.js js-mdict 作为后端&#xff0c;vue 3 vite 作为前端&#xff0c;编写在线查询英汉词典 后端部分&#xff08;express js-mdict &#xff09; 1. 项目结构 首先&#xff0c;创建一个项目目录&#xff0c;结构如下&#xff1…...

mysql之事务深度解析与实战应用:保障数据一致性的基石

文章目录 MySQL 事务深度解析与实战应用&#xff1a;保障数据一致性的基石一、事务核心概念与原理1.1 事务的本质与意义1.2 事务的 ACID 特性1.2.1 原子性 (Atomicity)1.2.2 一致性 (Consistency)1.2.3 隔离性 (Isolation)1.2.4 持久性 (Durability) 1.3 事务隔离级别与并发问题…...

einops测试

文章目录 1. einops2. code3. pytorch 1. einops einops 主要是通过爱因斯坦标记法来处理张量矩阵的库&#xff0c;让矩阵处理上非常简单。 conda : conda install conda-forge::einopspython: 2. code import torch import torch.nn as nn import torch.nn.functional as…...

华为云deepseek大模型平台:deepseek满血版

华为云硅基流动使用Chatbox接入DeepSeek-R1满血版671B 1、注册&#xff1a; 华为云deepseek大模型平台注册&#xff1a;https://cloud.siliconflow.cn/i/aDmz6aVN 说明&#xff1a;填写邀请码的话邀请和被邀请的账号都会获得2000 万 Tokens&#xff1b;2个帐号间不会与其他关联…...

Elasticsearch Open Inference API 增加了对 Jina AI 嵌入和 Rerank 模型的支持

作者&#xff1a;Hemant Malik 及 Joan Fontanals Martnez 探索如何使用 Elasticsearch Open Inference API 访问 Jina AI 模型。 我们在 Jina AI 的朋友们将 Jina AI 的嵌入模型和重新排名产品的原生集成添加到 Elasticsearch 开放推理 API 中。这包括对行业领先的多语言文本嵌…...

在PHP Web开发中,实现异步处理有几种常见方式的优缺点,以及最佳实践推荐方法

1. 消息队列 使用消息队列&#xff08;如RabbitMQ、Beanstalkd、Redis&#xff09;将任务放入队列&#xff0c;由后台进程异步处理。 优点&#xff1a; 任务持久化&#xff0c;系统崩溃后任务不丢失。 支持分布式处理&#xff0c;扩展性强。 实现步骤&#xff1a; 安装消息…...

如何设计app测试用例

功能测试 测试方法&#xff1a;等价类划分法、边界值法、场景法、因果图法。优先级设定&#xff1a;核心业务功能设为高优先级。需求覆盖 正向场景、反向场景、关联接口串场景 与后端开发确认测试用例是否全面覆盖后端逻辑。和产品确认用例是否覆盖本次需求&#xff0c;以及是否…...

《炒股养家心法.pdf》 kimi总结

《炒股养家心法.pdf》这篇文章详细阐述了一位超级游资炒股养家的心得与技巧&#xff0c;展示了其从40万到10亿的股市传奇。以下是文章中炒股技巧和心得的详细总结&#xff1a; 1.核心理念 市场情绪的理解&#xff1a;炒股养家强调&#xff0c;股市的本质是群体博弈&#xff0c…...

DVWA 靶场

DVWA 靶场的通关 刚建立和使用 输入 http://dvwa:8898/setup.php //进入用户名 密码 dvwa 你自己设计的想要进入数据库 点击creat 用户名 密码 admin passwordAttack type Sniper模式 在Sniper模式下&#xff0c;Payload字典用于逐个替换请求中标记的位置。例如&#x…...

【C语言】(一)数据在计算机中的存储与表示

目录 一、存储单位&#xff08;比特/字节&#xff09; 二、数制/进制&#xff08;二/八/十/十六&#xff09; 三、码制&#xff08;原码/反码/补码/移码&#xff09; 四、二进制表示小数 &#xff08;一&#xff09;定点数 &#xff08;二&#xff09;浮点数 十进制转化…...

大语言模型微调的公开JSON数据

大语言模型微调的公开JSON数据 以下是一些可用于大语言模型微调的公开JSON数据及地址: EmoLLM数据集 介绍:EmoLLM是一系列能够支持理解用户、帮助用户心理健康辅导链路的心理健康大模型,其开源了数据集、微调方法、训练方法及脚本等。数据集按用处分为general和role-play两种…...

solidity之Foundry安装配置(一)

一门面向合约的高级编程语言&#xff0c;主要用来编写以太坊只能合约。 Solidity受C语言&#xff0c;Python和js影响&#xff0c;但为编译成为以太坊虚拟机字节码在EVM上执行&#xff0c;很多特性和限制都和EVM相关。 Solidity 是静态类型语言&#xff0c;支持继承、库、自定义…...

【个人开源】——从零开始在高通手机上部署sd(二)

代码&#xff1a;https://github.com/chenjun2hao/qualcomm.ai 推理耗时统计 单位/ms 硬件qnncpu_clipqnncpu_unetqnncpu_vaehtp_cliphtp_unethtp_vae骁龙8 gen124716.994133440.39723.215411.097696.327 1. 下载依赖 下载opencv_x64.tar,提取码: rrbp下载opencv_aarch64.t…...

【精调】LLaMA-Factory 快速开始4 自定义个一个sharegpt数据集并训练

数据格式说明 LLaMA Factory:微调LLaMA3模型实现角色扮演 数据集 参考 开源模型应用落地-DeepSeek-R1-Distill-Qwen-7B-LoRA微调-LLaMA-Factory-单机单卡-V100(一) 大神给出的数据集的讲解:注册 如...

【Java】单例模式

单例模式 所谓类的单例设计模式&#xff0c;就是采取一定的方法保证在整个的软件系统中&#xff0c;对某个类只能存在一个对象实例&#xff0c;并且该类只提供一个取得其对象实例的方法。 单例模式包含懒汉式和饿汉式&#xff0c;运行有且仅有一个实例化对象&#xff0c;只会…...

REACT--组件通信

组件之间如何进行通信&#xff1f; 组件通信 组件的通信主要借助props传递值 分为整体接收、解构接收 整体接收 import PropTypes from prop-types;//子组件 function Welcome(props){return (<div>hello Welcome,{props.count},{props.msg}</div>) }// 对 We…...

第16届蓝桥杯模拟赛3 python组个人题解

第16届蓝桥杯模拟赛3 python组 思路和答案不保证正确 1.填空 如果一个数 p 是个质数&#xff0c;同时又是整数 a 的约数&#xff0c;则 p 称为 a 的一个质因数。 请问&#xff0c; 2024 的最大的质因数是多少&#xff1f; 因为是填空题&#xff0c;所以直接枚举2023~2 &am…...

FFMPEG编码容错处理解决办法之途径----升级库文件

在qt开发环境下接收网络数据&#xff0c;调用ffmpeg解码播放视频&#xff0c;出现闪屏现象&#xff0c;具体现象可以使用操作系统自带的ffplay播放器播放原始视频流可复现&#xff1b;而使用操作系统自带的mpv播放器播放视频则不会出现闪屏&#xff1b;闪屏时会报Could not fin…...

kkFileView报错no office manager available

背景 部署环境:虚机Linux系统 发生问题的版本:4.1.0-SNAPSHOT 现象:有的docx文件可以预览,有的不可以。不可以的就怎么打开都不可以(不管你是躺着,站着,坐着,睡着,趴着都不行,哈哈) 报错内容 贴出主要的报错内容步骤: > no office manager available > tr…...

C++ 设计模式-模板方法模式

文件处理 #include <iostream>// 抽象基类&#xff1a;定义模板方法和抽象步骤 class DataProcessor { public:// 模板方法&#xff08;固定流程&#xff09;void Process() {OpenFile();ProcessData(); // 由子类实现CloseFile();}protected:virtual void ProcessData…...

MacOS下使用Ollama本地构建DeepSeek并使用本地Dify构建AI应用

目录 1 大白话说一下文章内容2 作者的电脑配置3 DeepSeek的本地部署3.1 Ollamal的下载和安装3.2 选择合适的deepseek模型3.3 安转deepseek 4 DifyDeepSeek构建Al应用4.1 Dify的安装4.1.1 前置条件4.1.2 拉取代码4.1.3 启动Dify 4.2 Dify控制页面4.3 使用Dify实现个“文章标题生…...

区块链相关方法-波士顿矩阵 (BCG Matrix)

波士顿矩阵&#xff08;BCG Matrix&#xff09;&#xff0c;又称市场增长率 - 相对市场份额矩阵、波士顿咨询集团法、四象限分析法、产品系列结构管理法等&#xff0c;由美国著名的管理学家、波士顿咨询公司创始人布鲁斯・亨德森于 1970 年首创1。以下是关于波士顿矩阵的详细介…...

命令执行漏洞 Command Execute

命令执行漏洞&#xff08;Command Injection&#xff09;是一种安全漏洞&#xff0c;指的是攻击者能够在应用程序的命令行中注入并执行恶意命令。简单来说&#xff0c;就是攻击者可以利用这个漏洞让程序执行自己指定的命令&#xff0c;而不是程序原本应该执行的命令。 举个例子…...

黑马点评_商品信息缓存模块

保证缓存不要有空档期 删除后马上要写入中间不能插入任何阶段(如查询数据库) 对于单体系统1&#xff0c;将缓存与数据库操作放在同一个事务中&#xff08;当前项目就是一个单体项目&#xff0c;所以选择这种方式&#xff09; 对于分布式系统2&#xff0c;利用TCC&#xff08;Tr…...

socket()函数的概念和使用案例

socket()函数的概念&#xff08;C语言&#xff09; 在C语言中&#xff0c;socket() 函数是用于创建一个新的套接字&#xff0c;它是网络编程的基础。套接字可以看作是不同计算机进程间通信的一个端点&#xff0c;允许数据在网络中的发送和接收。 socket() 函数的原型定义在 &l…...

【架构】事件驱动架构(Event - Driven Architecture,EDA)

一、事件驱动架构理论基础 事件驱动架构(Event - Driven Architecture,EDA)是一种软件设计范式,事件驱动的体系结构由生成事件流、侦听这些事件的事件使用者以及将事件从生成者传输到使用者的事件通道组成。 在事件驱动架构中,系统的行为由事件触发。事件可几乎实时发送,…...

三、linux字符驱动详解

在上一节完成NFS开发环境的搭建后&#xff0c;本节将探讨Linux字符设备驱动的开发。字符设备驱动作为Linux内核的重要组成部分&#xff0c;主要负责管理与字符设备&#xff08;如串口、键盘等&#xff09;的交互&#xff0c;并为用户空间程序提供统一的读写操作接口。 驱动代码…...

14.9 Auto-GPT 提示工程深度解析:设计具备自主决策能力的智能体大脑

Auto-GPT 提示工程深度解析:设计具备自主决策能力的智能体大脑 关键词:Auto-GPT 提示工程、结构化提示模板、工具调用触发、动态上下文管理、自主决策优化 1. 自主智能体提示设计的核心原则 Prompt 设计三维度模型: #mermaid-svg-jHMGjPZTQA8Op385 {font-family:"tre…...

【p-camera-h5】 一款开箱即用的H5相机插件,支持拍照、录像、动态水印与样式高度定制化。

【开源推荐】p-camera-h5&#xff1a;一款轻量级H5相机插件开发实践 一、插件背景 在Web开发中&#xff0c;原生摄像头功能的集成往往面临以下痛点&#xff1a; 浏览器兼容性问题视频流与水印叠加实现复杂移动端适配困难功能定制成本高 为此&#xff0c;p-camera-h5 —— 一…...

c++中sleep是什么意思(不是Sleep() )

sleep 函数在 C 语言中用于暂停程序执行指定的秒数&#xff0c;语法为 sleep(unsigned int seconds)。当 seconds 为 0 时&#xff0c;函数立即返回&#xff0c;否则函数将使进程暂停指定的秒数&#xff0c;并返回实际暂停的时间。 sleep 函数在 C 中的含义 sleep 函数是 C 标…...

优品指标树

目录 大势型 超买超卖型 超势型 能量型 成交量型 均线型 路径型 指南针经典指标 神系经典指标 庄家克星经典指标 大智慧经典指标 钱龙经典指标 同花顺经典指标 通达信经典指标 操盘手经典指标 期货特色指标 股票特色推荐 用户推荐共享指标 名家经典战法指标…...

springboot多实例部署时,@Scheduled注释的方法重复执行

问题&#xff1a;springboot多实例部署时&#xff0c;Scheduled注释的方法重复执行 在 Spring Boot 中要实现 Redis 的SET NX EX命令&#xff0c;可以借助 Spring Data Redis 来完成。SET NX EX命令用于在键不存在时设置键值对&#xff0c;并同时设置过期时间。 <dependen…...

智能自动化新纪元:AI与UiPath RPA的协同应用场景与技术实践

智能自动化新纪元&#xff1a;AI与UiPath RPA的协同应用场景与技术实践 引言 在数字化转型的浪潮中&#xff0c;企业对于自动化技术的需求已从简单的任务执行转向更复杂的智能决策。传统RPA&#xff08;Robotic Process Automation&#xff09;通过模拟人类操作处理重复性任务…...

[STM32 - 野火] - - - 固件库学习笔记 - - - 十六.在SRAM中调试代码

一、简介 在RAM中调试代码是一种常见的嵌入式开发技术&#xff0c;尤其适用于STM32等微控制器。它的核心思想是将程序代码和数据加载到微控制器的内部RAM&#xff08;SRAM&#xff09;中运行&#xff0c;而不是运行在Flash存储器中。这种方法在开发过程中具有显著的优势&#…...

nginx 反向代理 配置请求路由

nginx | 反向代理 | 配置请求路由 nginx简介 Nginx&#xff08;发音为“Engine-X”&#xff09;是一款高性能、开源的 Web 服务器和反向代理服务器&#xff0c;同时也支持邮件代理和负载均衡等功能。它由俄罗斯程序员伊戈尔西索夫&#xff08;Igor Sysoev&#xff09;于 2004…...

第二届粤港澳大湾区数字经济与人工智能国际学术会议(DEAI 2025)

重要信息 2025年3月28-30日 I 广东省东莞市(广东科技学院-松山湖校区&#xff09; I www.icdeai.com 简介 第二届粤港澳大湾区数字经济与人工智能(DEAI 2025)将在2025年3月28-30日在广东省东莞市隆重举行。来自国内外高等院校、科学研究所、企事业单位的专家、教授、学者、…...

使用GDI+、文件和目录和打印API,批量将图片按文件名分组打包成PDF

代码写了两个小时&#xff0c;速度太慢&#xff08;包括学习文档的时间&#xff09; #include <stdio.h> #include <Windows.h> #include <gdiplus.h> #include <string.h> using namespace Gdiplus; #pragma comment(lib, "Gdiplus.lib") …...

贪心算法

int a[1000], b5, c8; swap(b, c); // 交换操作 memset(a, 0, sizeof(a)); // 初始化为0或-1 引导问题 为一个小老鼠准备了M磅的猫粮&#xff0c;准备去和看守仓库的猫做交易&#xff0c;因为仓库里有小老鼠喜欢吃的五香豆&#xff0c;第i个房间有J[i] 磅的五香豆&#xf…...

如何查询网站是否被百度蜘蛛收录?

一、使用site命令查询 这是最直接的方法。在百度搜索框中输入“site:你的网站域名”&#xff0c;例如“site:example.com”&#xff08;请将“example.com”替换为你实际的网站域名&#xff09;。如果搜索结果显示了你的网站页面&#xff0c;并且显示了收录的页面数量&#xf…...

Hutool - Log:自动识别日志实现的日志门面

一、简介 在 Java 开发中&#xff0c;日志记录是一项非常重要的功能&#xff0c;它可以帮助开发者在开发和生产环境中监控程序的运行状态、排查问题。然而&#xff0c;Java 生态系统中有多种日志实现框架&#xff0c;如 Log4j、Logback、JDK 自带的日志框架等。为了在不同的项…...

【GPU驱动】- 状态机

一、概述 Mesa 是一个开源的图形库&#xff0c;它提供了一个通用的图形抽象层&#xff0c;支持多种硬件和驱动程序。Mesa 的核心组件之一是 State Tracker&#xff0c;它在抽象图形 API&#xff08;如 OpenGL &#xff09;与具体的图形驱动之间起到桥梁作用。State Tracker 通…...

rtcwake - Linux下定时唤醒计算机

rtcwake 是一个用于通过实时时钟&#xff08;RTC&#xff09;唤醒计算机的工具。它常用于在 Linux 系统中设置计算机在指定时间自动唤醒或关闭。以下是对命令 rtcwake -m off -s ${sleep_time} 的详细解析&#xff1a; 命令解析 bash复制 rtcwake -m off -s ${sleep_time} 1…...

MySQL 日志

MySQL 日志 慢查询日志(Slow query log) 慢查询⽇志由执⾏时间超过系统变量 long_query_time 指定的秒数的SQL语句组成&#xff0c;并且检 查的⾏数⼤于系统变量 min_examined_row_limit 指定值。被记录的慢查询需要进⾏优化&#xff0c; 可以使⽤mysqldumpslow客⼾端程序对慢…...

C++ 泛型编程之补充(class 和typename)

目录 1.class 和 typename 可互换 1.1 template 和 template 在模板参数列表中完全一样&#xff0c;可以互换使用。 2.什么时候 class 和 typename 不一样&#xff1f; 2.1 嵌套依赖类型 时必须用typename 重点说明&#xff1a; 2.2 普通作用域&#xff08;不能互换&…...

[MDM 2024]Spatial-Temporal Large Language Model for Traffic Prediction

论文网址&#xff1a;[2401.10134] Spatial-Temporal Large Language Model for Traffic Prediction 论文代码&#xff1a;GitHub - ChenxiLiu-HNU/ST-LLM: Official implementation of the paper "Spatial-Temporal Large Language Model for Traffic Prediction" …...