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

Dijkstra算法

Dijkstra算法(迪杰斯特拉算法)是一种经典的单源最短路径算法,用于在加权图中找到从一个源点到所有其他顶点的最短路径。它要求图中不能有负权边,因为负权边可能会导致算法的贪心策略失效。

Dijkstra算法的基本思想

Dijkstra算法的核心思想是贪心算法,通过逐步扩展已知最短路径的集合,最终找到从源点到所有顶点的最短路径。

算法步骤:
  1. 初始化

    • 将源点到自身的距离设为0,即 dist[source] = 0
    • 将源点到其他所有顶点的距离设为无穷大,即 dist[v] = +∞
    • 使用一个优先队列(最小堆)来存储待处理的顶点,初始时将源点加入队列。
  2. 松弛操作

    • 从优先队列中取出距离最小的顶点 u
    • 对于顶点 u 的所有出边 (u, v),尝试更新从源点到顶点 v 的距离:
      if dist[u] + weight(u, v) < dist[v]:dist[v] = dist[u] + weight(u, v)
      
    • 如果更新了 dist[v],则将顶点 v 加入优先队列。
  3. 重复上述过程,直到优先队列为空。

Dijkstra算法的实现

以下是Dijkstra算法的标准实现,使用优先队列(最小堆)来优化松弛操作。

#include <iostream>
#include <vector>
#include <queue>
#include <climits>
using namespace std;const int MAXN = 100005; // 最大顶点数
const int INF = 0x3f3f3f3f; // 表示无穷大struct Edge {int to, weight;
};vector<Edge> graph[MAXN]; // 邻接表存储图
int dist[MAXN];           // 存储从源点到每个顶点的最短距离
bool visited[MAXN];       // 标记顶点是否已经被处理// Dijkstra算法
void dijkstra(int n, int source) {// 初始化for (int i = 1; i <= n; i++) {dist[i] = INF;visited[i] = false;}dist[source] = 0;// 使用优先队列(最小堆)priority_queue<pair<int, int>, vector<pair<int, int>>, greater<>> pq;pq.push({0, source}); // {距离, 顶点}while (!pq.empty()) {int u = pq.top().second; // 当前顶点int d = pq.top().first;  // 当前顶点的距离pq.pop();if (visited[u]) continue; // 如果已经处理过,跳过visited[u] = true;// 遍历所有出边for (const auto& edge : graph[u]) {int v = edge.to;int weight = edge.weight;// 尝试松弛if (dist[u] + weight < dist[v]) {dist[v] = dist[u] + weight;pq.push({dist[v], v}); // 将更新后的顶点加入队列}}}
}int main() {int n, m, source;cout << "Enter number of vertices and edges: ";cin >> n >> m;cout << "Enter source vertex: ";cin >> source;cout << "Enter edges (u, v, weight):" << endl;for (int i = 0; i < m; i++) {int u, v, weight;cin >> u >> v >> weight;graph[u].push_back({v, weight}); // 添加边}dijkstra(n, source);cout << "Shortest distances from source vertex " << source << ":" << endl;for (int i = 1; i <= n; i++) {if (dist[i] == INF) {cout << "Vertex " << i << ": No path" << endl;} else {cout << "Vertex " << i << ": " << dist[i] << endl;}}return 0;
}

算法复杂度

  • 时间复杂度
    • 如果使用普通数组实现,时间复杂度为 O(V²)
    • 如果使用优先队列(最小堆)实现,时间复杂度为 O(E + V log V),其中 E 是边数,V 是顶点数。
  • 空间复杂度O(V + E),主要用于存储图的邻接表和辅助数组。

适用场景

Dijkstra算法适用于以下场景:

  1. 图中不包含负权边
  2. 需要快速计算从单个源点到所有其他顶点的最短路径。
  3. 图的边数较多,且顶点数较少(适合稀疏图)。

注意事项

  1. 负权边问题

    • Dijkstra算法不能处理负权边。如果图中可能包含负权边,应使用Bellman-Ford算法或SPFA算法。
  2. 图的表示

    • 在实际应用中,图可以用邻接表或邻接矩阵表示。邻接表更适合稀疏图,而邻接矩阵更适合稠密图。
  3. 优化

    • 如果图中包含大量顶点,但只有少数顶点需要计算最短路径,可以使用启发式算法(如A*算法)来进一步优化。

总结

Dijkstra算法是一种高效的单源最短路径算法,特别适合处理不包含负权边的图。它通过贪心策略逐步扩展已知最短路径的集合,并利用优先队列优化松弛操作,从而在大多数情况下能够快速找到最短路径。

相关文章:

Dijkstra算法

Dijkstra算法&#xff08;迪杰斯特拉算法&#xff09;是一种经典的单源最短路径算法&#xff0c;用于在加权图中找到从一个源点到所有其他顶点的最短路径。它要求图中不能有负权边&#xff0c;因为负权边可能会导致算法的贪心策略失效。 Dijkstra算法的基本思想 Dijkstra算法…...

Python中的静态方法如何使用?

在Python里&#xff0c;类当中的方法可以分为多种不同的类型&#xff0c;其中staticmethod是一个十分有趣而又实用的功能。我们来好好地聊一聊什么是静态方法&#xff0c;它的用途是什么&#xff0c;以及如何在实际应用中使用它们&#xff01; 首先&#xff0c;定义一下静态方…...

【最后203篇系列】016 Q201架构思考

前言 Q200已经达到了我既定的目标&#xff0c;在最近的3个月&#xff0c;我需要进一步完善&#xff0c;达到可以试产的程度。 在这个过程当中&#xff0c;许多知识和体会一直在变。 qtv200到目前&#xff0c;虽然通过习惯(每晚运行离线策略和比对)方式维持了注意力的集中&…...

小脑萎缩会致命吗?

小脑萎缩&#xff0c;顾名思义&#xff0c;是指小脑的体积减小或结构发生异常&#xff0c;进而影响其正常功能。小脑作为人体重要的协调和运动控制中心&#xff0c;负责维持身体平衡、调节肌肉张力和协调运动等关键功能。当小脑出现萎缩时&#xff0c;患者可能会出现步态不稳、…...

pip install和conda install的区别

这里写目录标题 一、什么是 Python 依赖&#xff08;Python Dependencies&#xff09;&#xff1f;1. 依赖的作用2. 如何管理 Python 依赖3. 依赖管理问题4. 依赖锁定总结 二、使用pip安装包venv隔离环境方法 1&#xff1a;使用 venv&#xff08;推荐&#xff09;创建虚拟环境激…...

這是我第一次寫關於aapenal服務器管理控制面板的文章

首先我們來認識一下服務器管理面板的所有功能  網站管理功能&#xff1a; 支持創建和管理多個網站。配置虛擬主機&#xff08;Vhost&#xff09;和域名綁定。自動安裝常用應用&#xff08;如WordPress、Joomla等&#xff09;。  文件管理功能&#xff1a; 文件上傳、…...

requests库的request和response对象的属性和方法

Python requests库 request 参数信息 response 参数信息...

8664蛋糕的美味值

8664蛋糕的美味值 ⭐️难度&#xff1a;中等 &#x1f31f;考点&#xff1a;枚举 &#x1f4d6; &#x1f4da; import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in );int n sc.nextInt();int k s…...

【MySQL】数据库简要介绍和简单应用

目录 数据库简要介绍 SQL 的简单应用 需要注意的&#xff1a; 数据库简要介绍 数据库(database)是指长期存储在计算机内&#xff0c;有组织的、可共享的数据集合。它可视为一个电子化的文件柜&#xff0c;用来存储电子文件,用户可以对文件中的数据进行査询、新增、更新、删…...

yolo环境 pytorch环境配置 CUDA安装

我的成功案例&#xff1a;首先安装python 3.12.9的conda虚拟环境 &#xff08;如果不安装3.12的会报错误ModuleNotFoundError&#xff1a;没有名为“numpy._core”的模块&#xff09; 然后安装11.8cuda &#xff08;其实我是可以最高安装12.6的cuda但我实测&#xff0c;太高版…...

camellia redis proxy v1.3.3对redis主从进行读写分离(非写死,自动识别故障转移)

1 概述 camellia-redis-proxy是一款高性能的redis代理&#xff08;https://github.com/netease-im/camellia&#xff09;&#xff0c;使用netty4开发&#xff0c;主要特性如下&#xff1a; 支持代理到redis-standalone、redis-sentinel、redis-cluster。支持其他proxy作为后端…...

python相关语法的学习文档1

python相关语法的学习文档1 1、tqdm tqdm 是 Python 中一个非常流行的进度条库,可以实时显示循环或任务的进度。它简单易用,支持多种场景(如循环、文件处理、多线程/进程等)。以下是详细的使用讲解: 1.1 安装 pip install tqdm1.2 基本用法 from tqdm import tqdm impo…...

Web元件库 ElementUI元件库+后台模板页面(支持Axure9、10、11)

Axure是一款非常强大的原型设计工具&#xff0c;它允许设计师和开发者快速创建高保真原型&#xff0c;以展示应用或网站的设计和功能。通过引入各种元件库&#xff0c;如ElementUI元件库&#xff0c;可以极大地丰富Axure的原型设计能力&#xff0c;使其更加贴近实际开发中的UI组…...

Java 并发编程——BIO NIO AIO 概念

参考 Java 并发编程——BIO NIO AIO 概念 阻塞与非阻塞、同步与异步概念 系统调用、缓存、物理设备阻塞与非阻塞同步与异步 四种主要的 IO 模型 同步阻塞 IO同步非阻塞 IOIO 多路复用异步 IO select&#xff0c;poll&#xff0c;epoll 系统调用命令...

在微信小程序或前端开发中,picker 和 select 都是用户交互中用于选择的组件,但它们在功能、设计和使用场景上有一定的区别

在微信小程序或前端开发中&#xff0c;picker 和 select 都是用户交互中用于选择的组件&#xff0c;但它们在功能、设计和使用场景上有一定的区别。 1. picker 的特点 描述&#xff1a; picker 是微信小程序中的原生组件&#xff0c;通常用于选择单项或多项值&#xff0c;如时…...

笔记本 Win10 部署阿里通义千问 1.5-0.5B 大模型 mini 版

文章目录 1.环境准备1.1 硬件环境1.2 OS 环境1.3 Python 环境 2.环境安装2.1 CUDA 驱动下载安装2.2 torch 库下载安装2.3 transformers 库安装2.3 accelerate 库安装2.4 验证 CUDA 是否可用2.5 下载 Qwen1.5-0.5B 大模型 3.测试大模型3.1 加载大模型3.2 简单对话3.3 亲测体验感…...

SpringBoot事件驱动

1、概述 Spring事件驱动采用了观察者设计模式&#xff0c;主要作用就是实现对象之间的松耦合通信。它的核心思想是通过事件的发布和监听来实现不同组件之间的交互。&#xff08;跟mq挺像&#xff09; 基础概念&#xff1a; 事件&#xff08;Event&#xff09;: 在Spring中&am…...

nginx中间件部署

普通权限账户安装NGINX中间件 1、拥有高级权限的账户安装必要的插件 sudo yum install -y gcc-c make pcre pcre-devel zlib zlib-devel openssl openssl-devel 2、普通账户进行NGINX的脚本式安装 vi nginx_intall.sh #!/bin/bash TAR_NAME"$1" TAR_NAME_DIRba…...

Qt程序基于共享内存读写CodeSys的变量

文章目录 1.背景2.结构体从CodeSys导出后导入到C2.1.将结构体从CodeSys中导出2.2.将结构体从m4文件提取翻译成c格式 3.添加RTTR注册信息4.读取PLC变量值5.更改PLC变量值 1.背景 在文章【基于RTTR在C中实现结构体数据的多层级动态读写】中&#xff0c;我们实现了通过字符串读写…...

vulnhub-Hackme-隧道建立、SQL注入、详细解题、思路清晰。

vulnhub-Hackme-隧道建立、SQL注入、详细解题、思路清晰。 一、信息收集 2025.3.14 PM 12&#xff1a;18 1、主机发现 arp-scan -l nmap -sn 192.168.66.0/24 2、端口扫描 1、nmap --min-rate 10000 -p- 192.168.66.182 -oA port 查看所有开放端口2、map -sS -sV 192.168.6…...

技术-NBIOT

是什么&#xff1f; 窄带物联网&#xff08;Narrow Band Internet of Things, NB-IoT&#xff09;成为万物互联网络的一个重要分支支持低功耗设备在广域网的蜂窝数据连接&#xff0c;也被叫作低功耗广域网(LPWAN)NB-IoT支持待机时间长、对网络连接要求较高设备的高效连接NB-Io…...

【论文阅读】AlexNet——深度学习奠基作之一

原文链接 Step 1 1. titleabstract 第一句&#xff1a;告诉我干了什么事情 我们训练了一个很大很深的卷积神经网络&#xff0c;用来对120w个图片作分类&#xff0c;这里面有1000个类 第二句&#xff1a;结果 在测试集上面&#xff0c;top-1 error37.5%&#xff0c;top-517.0…...

【云原生技术】编排与容器的技术演进之路

一、编排与容器的技术演进之路 1.1 DockerClient 此时 K8s 只是编排领域的一个选择&#xff0c;而 Docker 此时一家独大&#xff0c;所以 K8s 的客户端只 是作为 Docker 的客户端来调用 Docker 引擎来完成服务。 1.2 RUNC&Shim OCI催生 runcrunc&#xff0c;剥离 Docke…...

鸿蒙编译框架插件HvigorPlugin接口的用法介绍

鸿蒙系统中HvigorPlugin接口实现自定义编译插件&#xff0c;实现编译前后自定义功能。 在鸿蒙&#xff08;HarmonyOS&#xff09;开发中&#xff0c;HvigorPlugin 是用于扩展 Hvigor 构建工具功能的接口。通过实现此接口&#xff0c;开发者可以自定义构建任务、修改构建流程或…...

Springboot+mybatis实现增删改查操作

继续写一下删除操作&#xff0c;删除有些不一样&#xff0c;首先在controller里面&#xff0c;我们需要改一下路由&#xff0c;我们后面要写/{id}传入路径参数&#xff0c;用PathVariable注解绑定id&#xff0c;剩下的都一样&#xff0c;传入id&#xff0c;然后写service和mapp…...

Java中的I/O

1.I/O流 1.1I/O概述 1.2.基本用法 1.3.字节输出流写数据的细节 1.4.FileOutPutStream写数据的三种方式 明天再更~~~~&#xff0c;先混个流量券。...

前端组件封装艺术:设计原则与最佳实践指南

文章目录 一、组件封装的核心原则1.1 设计原则概览1.2 组件生命周期 二、组件设计准则2.1 单一职责原则2.2 高内聚低耦合 三、组件接口设计3.1 Props设计规范3.2 代码示例 四、组件状态管理4.1 状态设计原则4.2 代码示例 五、组件样式处理5.1 样式方案对比5.2 代码示例 六、组件…...

SpringMVC(五)拦截器

目录 拦截器基本概念 一 单个拦截器的执行 1 创建拦截器 2 SpringMVC配置&#xff0c;并指定拦截路径。 3 运行结果展示&#xff1a; 二 多个拦截器的执行顺序 三 拦截器与过滤器的区别 拦截器基本概念 SpringMVC内置拦截器机制&#xff0c;允许在请求被目标方法处理的…...

jupyter无法转换为PDF,HTMLnbconvert failed: Pandoc wasn‘t found.

无法转为PDF 手动下载工具 https://github.com/jgm/pandoc/releases/tag/3.6.3 似乎跟我想的不大一样&#xff0c;还有新的报错 https://nbconvert.readthedocs.io/en/latest/install.html#installing-tex 不知道下的啥玩意儿 sudo apt-get install texlive-xetex texlive-fon…...

【红黑树】—— 我与C++的不解之缘(二十五)

前言 学习了avl树&#xff0c;现在来学习红黑树。 一、什么是红黑树 红黑树是一颗平衡二叉搜索树&#xff0c;它每一个节点增加了一个存储位表示节点的颜色&#xff0c;可以是红色或者黑色。 相比较于AVL树&#xff0c;红黑树也是一个自平衡二叉搜索树&#xff0c;但是它与AVL树…...

机器学习 Day05 pandas库

1.pandas介绍和优点 Pandas 是 2008 年由 Wes McKinney 开发的开源 Python 库 。它专门用于数据挖掘和数据分析&#xff0c;具有以下特点&#xff1a; 数据结构独特&#xff1a;核心数据结构为 Series&#xff08;一维&#xff09;和 DataFrame&#xff08;二维&#xff09; …...

布达佩斯召开 | 2025年第五届能源与环境工程国际会议(CoEEE 2025)

会议简介 Brief Introduction 2025年第五届能源与环境工程国际会议(CoEEE 2025) 会议时间&#xff1a;2025年7月25日-27日 召开地点&#xff1a;匈牙利布达佩斯 大会官网&#xff1a;www.coeee.org CoEEE 2025将围绕“能源与环境工程”的最新研究领域而展开&#xff0c;为研究人…...

[C语言日寄] qsort函数的练习

【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋&#xff1a;这是一个专注于C语言刷题的专栏&#xff0c;精选题目&#xff0c;搭配详细题解、拓展算法。从基础语法到复杂算法&#xff0c;题目涉及的知识点全面覆盖&#xff0c;助力你系统提升。无论你是初学者&#xff0c;还是…...

单引号与双引号在不同编程语言中的使用与支持

在编程语言中&#xff0c;单引号和双引号是常见的符号&#xff0c;它们通常用来表示字符和字符串。然而&#xff0c;如何使用这两种符号在不同的编程语言中有所不同&#xff0c;甚至有一些语言并不区分单引号和双引号的用途。本文将详细介绍不同编程语言中单引号与双引号的支持…...

Next.js项目实战——MindAI

我的整个毕业论文&#xff0c;是基于Next.js搭建完成的。项目的搭建过程分为多个章节&#xff0c;循序渐进&#xff1a; 1.环境准备与项目初始化 Node.js和npm的安装配置创建Next.js 14项目TypeScript配置项目目录结构说明Git初始化和.gitignore配置 2.基础架构搭建 Tailwi…...

MindGYM:一个用于增强视觉-语言模型推理能力的合成数据集框架,通过生成自挑战问题来提升模型的多跳推理能力。

2025-03-13&#xff0c;由中山大学和阿里巴巴集团的研究团队提出了MindGYM框架&#xff0c;通过合成自挑战问题来增强视觉-语言模型&#xff08;VLMs&#xff09;的推理能力。MindGYM框架通过生成多跳推理问题和结构化课程训练&#xff0c;显著提升了模型在推理深度和广度上的表…...

WPS的Excel文档如何利用VB脚本批量替换超链接的内容

准备知识 关于WPS的Excel点击单元格打开别的文档的两种方法的探究【为单元格添加超链接】 https://blog.csdn.net/wenhao_ir/article/details/146212767 激活WPS的Excel文档中的VB编辑器功能 没有激活前的截图如下: 原因是我们的电脑中缺乏VBA插件,我们点击“开发工具”:…...

phpstudy+phpstorm+xdebug【学习笔记】

配置PHPStudy 配置PHPSTORM phpstorm选择PHP版本 配置DEBUG 设置服务器 编辑配置 学习参考链接&#xff1a;&#xff1a;https://blog.csdn.net/m0_60571842/article/details/133246064...

(包清楚解疑)ES6中__dirname和__filename不见了吗?,到底怎么用

我们知道&#xff0c;在commonJs中&#xff0c;__dirname和__filename分别表示当前js文件所在目录路径和所在路径的绝对路径。可以直接使用&#xff0c;但是在ES6和Node v20.11.0之后&#xff0c;不能直接用了。 首先明确一下这两个变量为什么会用到&#xff1a; 当我们在使用…...

3.4 基于TSX的渲染函数类型安全实践

文章目录 1. TSX与类型安全的核心价值1.1 TSX的独特优势1.2 类型安全的核心收益2. 基础类型安全实践2.1 组件Props类型约束2.2 子元素类型校验2.3 事件类型系统3. 高级类型安全模式3.1 泛型组件设计3.2 高阶组件类型3.3 类型守卫应用4. 类型操作工具集4.1 实用类型工具4.2 类型…...

vue-draggable-plus实现某些子元素不被拖拽

在使用vue-draggable-plus时倘若只是节点里面所有元素都可以拖拽倒还好实现&#xff0c;但遇到某些子元素是作为其他作用不可拖拽或者可拖拽不可替换这些情况&#xff0c;则比较头疼了 解决&#xff1a; 1. 绑定移动事件 2. 处理移动世界并对对应情况返回false //移动事件 co…...

基于SpringBoot的Mybatis和纯MyBatis项目搭建的区别

【由于之前学习MyBatis的时候是跟着视频敲的纯MyBatis项目&#xff0c;以至于在突然看到别人在SpringBoot项目里搭建MyBatis方式的时候很懵比…特此文字形式记录一下区别&#xff08;应该还有好多种其他方式是我不知道的&#xff0c;主要应该就是要知道关键的流程步骤&#xff…...

二进制数(十进制转二进制)

二进制数 #include<stdio.h> int main(){int n;while(scanf("%d",&n)!EOF){int a[10000];int i0;if(n0){printf("0\n");continue;}while(n){a[i]n%2;i;nn/2;}for(int ji-1;j>0;j--){printf("%d",a[j]);}printf("\n");}…...

一周学会Flask3 Python Web开发-SQLAlchemy添加数据操作-班级模块

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili SQLAlchemy提供session.add()方法添加model实体数据&#xff0c;以及提供session.commit()提交事务。 首先list.html加一个添…...

【python】OpenCV—Hough Circle Transform

文章目录 1、功能描述2、代码实现3、效果展示4、完整代码5、涉及到的库函数6、参考 更多有趣的代码示例&#xff0c;可参考【Programming】 1、功能描述 2、代码实现 载入必要的库 import sys import cv2 as cv import numpy as np函数入口 if __name__ "__main__&qu…...

1216走迷宫

1216走迷宫 ⭐️难度&#xff1a;简单 &#x1f31f;考点&#xff1a;bfs &#x1f4d6; &#x1f4da; import java.util.Arrays; import java.util.LinkedList; import java.util.Queue; import java.util.Scanner;public class Main {public static void main(String[] …...

Matlab实现RIME-CNN-LSTM-Multihead-Attention多变量多步时序预测

SCI一区级 | Matlab实现RIME-CNN-LSTM-Multihead-Attention多变量多步时序预测 目录 SCI一区级 | Matlab实现RIME-CNN-LSTM-Multihead-Attention多变量多步时序预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现RIME-CNN-LSTM-Multihead-Attention霜冰算法…...

医疗资源联动,广州长泰医院与海南德雅医院共筑地贫防治新篇章

​ 为贯彻落实"健康中国"战略关于出生缺陷综合防治的部署要求&#xff0c;推动地中海贫血防治体系建设。2025年3月15日&#xff0c;广州长泰医院与海南德雅医院联合主办的“地中海贫血生殖遗传干预大型义诊暨合作签约仪式”在广州正式启动&#xff0c;活动以“爱与希…...

栈区、堆区、静态区

一、栈区&#xff08;Stack&#xff09; 1.栈区是什么 •栈区&#xff08;Stack&#xff09;是计算机内存中的一部分&#xff0c;用于存储程序运行时的临时数据。 2.栈区的有关性质 &#xff08;1&#xff09;存储临时数据 • 栈区主要用于存储局部变量&#xff08;比如函…...

SpringBoot整合Swagger (Springfox 3.0.0)

Maven依赖 <dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artifactId><version>3.0.0</version> </dependency> 配置文件设置 # 解决"Unable to infer base url"错误的关键配…...