算法-数据结构(图)-迪杰斯特拉最短逻辑算法( Dijkstra)
迪杰斯特拉算法(Dijkstra's Algorithm) 是一种用于计算单源最短路径的经典算法,由荷兰计算机科学家 艾兹赫尔·迪杰斯特拉(Edsger W. Dijkstra) 于1956年提出。它的主要目标是找到从图中的某个源节点到所有其他节点的最短路径。该算法适用于带权有向图或无向图,且要求边的权重非负。
核心思想
迪杰斯特拉算法采用贪心策略,通过逐步扩展已知的最短路径集合来求解问题。具体步骤如下:
-
初始化:
-
设置一个数组
dist[],用于存储从源节点到每个节点的最短距离。初始时,源节点的距离为0,其他节点的距离为∞(表示不可达)。 -
设置一个数组
visited[],用于标记节点是否已被访问(即是否已找到从源节点到该节点的最短路径)。 -
设置一个数组
prev[],用于记录每个节点的前驱节点,以便后续重建路径。
-
-
选择当前最短路径节点:
-
从未访问的节点中选择一个距离源节点最近的节点
u(即dist[u]最小)。
-
-
更新邻居节点的距离:
-
对于节点
u的每个邻居节点v,检查是否存在一条从源节点经过u到v的路径,且该路径的距离比当前已知的dist[v]更短。 -
如果存在,则更新
dist[v]为dist[u] + weight(u, v),并记录v的前驱节点为u。
-
-
标记节点为已访问:
-
将节点
u标记为已访问。
-
-
重复:
-
重复步骤 2~4,直到所有节点都被访问。
-
算法特点
-
适用范围:
-
适用于带权图,且边的权重必须非负。
-
如果图中存在负权边,迪杰斯特拉算法可能会失效,此时可以使用 Bellman-Ford 算法。
-
-
时间复杂度:
-
使用**优先队列(堆)**优化后,时间复杂度为 O((V + E) log V),其中
V是节点数,E是边数。 -
如果使用简单的数组实现,时间复杂度为 O(V²)。
-
-
空间复杂度:
-
需要额外的空间存储
dist[]、visited[]和prev[],空间复杂度为 O(V)。
-
算法实现示例
图数据定义
import java.util.ArrayList;
import java.util.List;//邻接矩阵表示图
public class YuGraph {//顶点List<Character> vList;//边的联通性,初始为0,不联通int [][] vG;//初始化YuGraph(List<Character> list){vList=list;vG=new int[list.size()][list.size()];for(int i=0;i<list.size();i++){for(int j=0;j<list.size();j++){vG[i][j]=Integer.MAX_VALUE;}}}//插入边public void insertVg(int i,int j,int val){vG[i][j]=val;}
}
插入的图

算法实现
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;//
public class Dijkstra {//1.迪杰斯特拉算法public static void Dijks(YuGraph yuGraph,int source){//顶点数量int n=yuGraph.vG.length;
// System.out.println(n);//初始化最短距离int [] dist=new int[n];//初始设置为无限制大Arrays.fill(dist,Integer.MAX_VALUE);//目标点设置为0dist[source]=0;//访问数组标志,默认falseboolean [] flagArr=new boolean[n];//邻接矩阵int [][] vG=yuGraph.vG;//默认前驱节点int[] qianQU=new int [n];Arrays.fill(qianQU,-1);//遍历所有顶点找距离最小的索引开始更新邻居距离for(int i=0;i<n-1;i++){//开始访问的点int u=findMinIndex(dist,flagArr);
// System.out.println(u);flagArr[u]=true;//开始访问它的邻居for(int v=0;v<n;v++){//没有被访问过,和上一个节点联通,且上一个节点有最短路径,并且新的路径比原来的还要小就更新if(!flagArr[v]&&vG[u][v]!=Integer.MAX_VALUE&&dist[u]!=Integer.MAX_VALUE&&dist[u]+vG[u][v]<dist[v]){//更新最短距离dist[v]= dist[u]+vG[u][v];//记录前驱qianQU[v]=u;}}}printResult(dist,qianQU);}//2.未访问,最短路径的点的序列public static int findMinIndex(int [] dist,boolean [] flagArr){int minIndex=-1;int minDis=Integer.MAX_VALUE;for(int i=0;i<dist.length;i++){if(flagArr[i]==false&&dist[i]<minDis){minIndex=i;minDis=dist[i];}}return minIndex;}//3.打印最短路径信息public static void printResult(int [] dist, int[] qianQU) {for (int i = 0; i < dist.length; i++) {System.out.print((char) ('A' + i));System.out.print(" 最短路径为: ");System.out.print(dist[i]);System.out.print(" 路径: ");printPath(qianQU, i);System.out.println();}}// 辅助方法:打印从源节点到目标节点的路径public static void printPath(int[] qianQU, int target) {if (qianQU[target] != -1) {printPath(qianQU, qianQU[target]);}System.out.print((char) ('A' + target) + " ");}public static void main(String[] args) {List<Character> list=new ArrayList<>();for(int i=0;i<5;i++){list.add((char)('A'+i));}YuGraph yuGraph=new YuGraph(list);//初始化图//ab 10 ac 2yuGraph.insertVg(0,1,10);yuGraph.insertVg(0,2,2);//bd 2yuGraph.insertVg(1,3,2);//cb5,cd2,ce10yuGraph.insertVg(2,1,5);yuGraph.insertVg(2,3,2);yuGraph.insertVg(2,4,10);//de 5yuGraph.insertVg(3,4,5);//调用迪杰斯特拉最短路径算法Dijks(yuGraph,0);}
}
相关文章:
算法-数据结构(图)-迪杰斯特拉最短逻辑算法( Dijkstra)
迪杰斯特拉算法(Dijkstras Algorithm) 是一种用于计算单源最短路径的经典算法,由荷兰计算机科学家 艾兹赫尔迪杰斯特拉(Edsger W. Dijkstra) 于1956年提出。它的主要目标是找到从图中的某个源节点到所有其他节点的最短…...
C语言【进阶篇】之指针——涵盖基础、数组与高级概念
目录 🚀前言🤔指针是什么🌟指针基础💯内存与地址💯指针变量💯 指针类型💯const 修饰指针💯指针运算💯野指针和 assert 断言 💻数组与指针💯数组名…...
关于命令行下的 git( git add、git commit、git push)
文章目录 关于 gitgit 的概念git 操作(git add、git commit、git push 三板斧)安装 git新建仓库及配置git clone.gitignoregit addgit commitgit push其他 git 指令git pull(把远端的东西拉到本地进行同步)其他指令 关于 git git…...
DaoCloud 亮相 2025 GDC丨开源赋能 AI 更多可能
2025 年 2 月 21 日至 23 日,上海徐汇西岸,2025 全球开发者先锋大会以 “模塑全球,无限可能” 的主题,围绕云计算、机器人、元宇宙等多元领域,探讨前沿技术创新、应用场景拓展和产业生态赋能,各类专业论坛、…...
极速探索 HarmonyOS NEXT:开启国产操作系统开发的新篇章
极速探索 HarmonyOS NEXT:开启国产操作系统开发的新篇章 一、引言二、HarmonyOS NEXT 是什么?背景核心特性 三、HarmonyOS NEXT 的发展历程从 LiteOS 到 HarmonyOS 的逐步演进HarmonyOS NEXT 5.0 的发布 四、HarmonyOS NEXT 对科技的影响技术突破开发者生…...
火狐浏览器多开指南:独立窗口独立IP教程
无论是跨境电商从业者需要管理多个店铺账号,还是海外社交媒体营销人员要运营多个社交平台账号,亦或是从事多账号广告投放的人员,都面临着一个共同的挑战 —— 如何高效管理多个账号,并确保每个账号的独立性。 在这种情况下&#…...
内容中台是什么?内容管理平台解析
内容中台的核心价值 现代企业数字化转型进程中,内容中台作为中枢系统,通过构建统一化的内容管理平台实现数据资产的高效整合与智能调度。其核心价值体现在打破传统信息孤岛,将分散于CRM、ERP等系统的文档、知识库、产品资料进行标准化归集&a…...
1.2 Kaggle大白话:Eedi竞赛Transformer框架解决方案02-GPT_4o生成训练集缺失数据
目录 0. 本栏目竞赛汇总表1. 本文主旨2. AI工程架构3. 数据预处理模块3.1 配置数据路径和处理参数3.2 配置API参数3.3 配置输出路径 4. AI并行处理模块4.1 定义LLM客户端类4.2 定义数据处理函数4.3 定义JSON保存函数4.4 定义数据分片函数4.5 定义分片处理函数4.5 定义文件名排序…...
iOS指纹归因详解
iOS 指纹归因(Fingerprint Attribution)详解 1. 指纹归因的概念 指纹归因(Fingerprint Attribution)是一种无 ID 归因(ID-less Attribution)技术,主要用于广告跟踪、用户识别或流量分析。它基…...
sql server笔记
创建数据库 use master gocreate database stuuuuu//删除数据库if db_id ($$$) is not nullDrop database [$$$] go//新建表USE [studyTest] GOSET ANSI_NULLS ON GOSET QUOTED_IDENTIFIER ON GOCREATE TABLE [dbo].[Table_1]([id] [int] NULL,[name] [varchar](10) NULL ) ON…...
uni小程序wx.switchTab有时候跳转错误tab问题,解决办法
在一个子页面里面使用uni.switchTab或者wx.switchTab跳转到tab菜单的时候,先发送了一个请求,然后执行跳转到tab菜单,但是这个时候,出错了........也是非常的奇怪,不加请求就没问题......但是业务逻辑就是要先执行某个请…...
【第十节】C++设计模式(结构型模式)-Flyweight( 享元)模式
目录 一、问题背景 二、模式选择 三、代码实现 四、总结讨论 一、问题背景 享元模式(Flyweight Pattern)在对象存储优化中的应用 在面向对象系统的设计与实现中,创建对象是最常见的操作之一。然而,如果一个应用程序使用了过多…...
AORO M6北斗短报文终端:将“太空黑科技”转化为安全保障
在卫星导航领域,北斗系统作为我国自主研发的全球卫星导航系统,正以其独特的短报文通信功能引发全球范围内的广泛关注。这一突破性技术不仅使北斗系统在全球四大导航系统中独树一帜,具备了双向通信能力,更通过遨游通讯推出的AORO M…...
深度生成模型(二)——基本概念与数学建模
上一篇笔记中提到了端到端模型底层核心采用了深度生成模型,先简单梳理一下 生成式人工智能(Artificial Intelligence Generated Content,AIGC)经历了从早期基于概率模型和规则系统的方法到现代深度生成模型的跨越式发展 深度神经…...
Mac本地部署Deep Seek R1
Mac本地部署Deep Seek R1 1.安装本地部署大型语言模型的工具 ollama 官网:https://ollama.com/ 2.下载Deepseek R1模型 网址:https://ollama.com/library/deepseek-r1 根据电脑配置,选择模型。 我的电脑:Mac M3 24G内存。 这…...
项目——仿RabbitMQ实现消息队列
1.项目介绍 曾经在学习Linux的过程中,我们学习过阻塞队列 (BlockingQueue) 。 当时我们说阻塞队列最大的用途, 就是用来实现生产者消费者模型。 生产者消费者模型是后端开发的常用编程方式, 它存在诸多好处: 解耦合支持并发支持忙闲不均削峰…...
【react】快速上手基础教程
目录 一、React 简介 1.什么是 React 2.React 核心特性 二、环境搭建 1. 创建 React 项目 2.关键配置 三、核心概念 1. JSX 语法 表达式嵌入 样式处理 2. 组件 (Component) 3. 状态 (State) 与属性 (Props) 4. 事件处理 合成事件(SyntheticEvent) 5. …...
流媒体网络协议全解析:从实时传输到自适应流,如何选择最优方案?
一、历史发展与协议提出者 流媒体协议的发展与互联网技术迭代紧密相关,主要分为三个阶段: 早期专有协议(1990s-2000s) RTSP/RTP 提出者:RealNetworks(RTSP初始推动者),后由IETF标准化(RFC 2326)。背景:1996年推出,用于视频监控和点播系统,基于UDP传输媒体流,支持…...
React + TypeScript 数据血缘分析实战
React TypeScript 数据血缘分析实战 目录 技术选型与架构设计核心概念解析基础场景实现 场景一:visx库基础血缘图实现场景二:React-Lineage-DAG企业级方案场景三:动态数据源与复杂交互 TypeScript类型系统深度优化性能优化与工程化实践开源…...
【nextjs官方demo】Chapter 6连接数据库报错
问题:跟着demo创建完成postgres数据库,并修改了env文件,需要访问/seed去初始化数据的时候: 报错信息如下,看信息就是bcrypt模块有问题: 排除了你的环境问题后,就看下面这句话: 它的…...
Nginx的反向代理(超详细)
正向代理与反向代理概念 1.概念: 反向代理服务器位于用户与目标服务器之间,但对用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源。同时,用户不需要知道目标服务…...
Plantsimulation中机器人怎么通过阻塞角度设置旋转135°
创建一个这样的简单模型。 检查PickAndPlace的角度表。源位于180的角位置,而物料终结位于90的角位置。“返回默认位置”选项未被勾选。源每分钟生成一个零件。启动模拟时,Plant Simulation会选择两个位置之间的最短路径。示例中的机器人无法绕135的角位…...
Docker数据卷容器实战
数据卷容器 数据共享 上面讲述的是主机和容器之间共享数据,那么如何实现容器和容器之间的共享数据呢?那就是创建 创建数据卷容器。 命名的容器挂载数据卷,其他容器通过挂载这个(父容器)实现数据共享,挂载…...
Imagination通过最新的D系列GPU IP将效率提升至新高度
Imagination DXTP GPU IP在加速移动设备和其他电力受限设备上的 图形和计算工作负载时,能够延长电池续航时间。 近日,Imagination Technologies(“Imagination”)宣布推出其最新的GPU IP——Imagination DXTP,该产品…...
第13天:数据序列化实战 - 从内存到磁盘的完美转换
第13天:数据序列化实战 - 从内存到磁盘的完美转换 一、今日学习目标 🧱 掌握二进制序列化的原理与实现📄 学习JSON格式的序列化方法💾 完成学生信息管理系统的通用数据存储方案🔍 理解不同序列化格式的适用场景 二、…...
【Rust中级教程】2.13. 结语(杂谈):我学习Rust的心路历程
2.13.1. 【Rust自学】专栏的缘起 笔者我在去年12月份之前对Rust还一无所知,后来看到JetBrains推出了Rust Rover,想着自己毕竟是买的全产品证书就下载下来玩了一下。原本就是看看,都打算卸载了,后来去网上查才发现Rust这门语言挺牛…...
【备赛】点亮LED
LED部分的原理图 led前面有锁存器,这是为了防止led会受到lcd的干扰(lcd也需要用到这些引脚)。 每次想要对led操作,就需要先打开锁存器,再执行操作,最后关闭锁存器。 这里需要注意的是,引脚配置…...
cpp中的继承
一、继承概念 在cpp中,封装、继承、多态是面向对象的三大特性。这里的继承就是允许已经存在的类(也就是基类)的基础上创建新类(派生类或者子类),从而实现代码的复用。 如上图所示,Person是基类&…...
WPF-3天快速WPF入门并达到企业级水准
嘿,小伙伴们!如果你已经有一定的C#开发基础,但想快速掌握WPF开发,达到企业级水准,那接下来的这个三天快速入门计划绝对适合你!虽然听起来有点挑战,但别担心,只要跟着这个高强度、结构…...
[Java基础] JVM常量池介绍(BeanUtils.copyProperties(source, target)中的属性值引用的是同一个对象吗)
文章目录 1. JVM内存模型2. 常量池中有什么类型?3. 常量池中真正存储的内容是什么4. 判断一个字符串(引用)是否在常量池中5. BeanUtils.copyProperties(source, target)中的属性值引用的是同一个对象吗?6. 获取堆内存使用情况、非堆内存使用情况 1. JVM内…...
