算法-数据结构(图)-迪杰斯特拉最短逻辑算法( Dijkstra)

迪杰斯特拉算法(Dijkstra's Algorithm) 是一种用于计算单源最短路径的经典算法,由荷兰计算机科学家 艾兹赫尔·迪杰斯特拉(Edsger W. Dijkstra) 于1956年提出。它的主要目标是找到从图中的某个源节点到所有其他节点的最短路径。该算法适用于带权有向图无向图,且要求边的权重非负


核心思想

迪杰斯特拉算法采用贪心策略,通过逐步扩展已知的最短路径集合来求解问题。具体步骤如下:

  1. 初始化

    • 设置一个数组 dist[],用于存储从源节点到每个节点的最短距离。初始时,源节点的距离为 0,其他节点的距离为 (表示不可达)。

    • 设置一个数组 visited[],用于标记节点是否已被访问(即是否已找到从源节点到该节点的最短路径)。

    • 设置一个数组 prev[],用于记录每个节点的前驱节点,以便后续重建路径。

  2. 选择当前最短路径节点

    • 从未访问的节点中选择一个距离源节点最近的节点 u(即 dist[u] 最小)。

  3. 更新邻居节点的距离

    • 对于节点 u 的每个邻居节点 v,检查是否存在一条从源节点经过 uv 的路径,且该路径的距离比当前已知的 dist[v] 更短。

    • 如果存在,则更新 dist[v]dist[u] + weight(u, v),并记录 v 的前驱节点为 u

  4. 标记节点为已访问

    • 将节点 u 标记为已访问。

  5. 重复

    • 重复步骤 2~4,直到所有节点都被访问。


算法特点

  1. 适用范围

    • 适用于带权图,且边的权重必须非负

    • 如果图中存在负权边,迪杰斯特拉算法可能会失效,此时可以使用 Bellman-Ford 算法

  2. 时间复杂度

    • 使用**优先队列(堆)**优化后,时间复杂度为 O((V + E) log V),其中 V 是节点数,E 是边数。

    • 如果使用简单的数组实现,时间复杂度为 O(V²)

  3. 空间复杂度

    • 需要额外的空间存储 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);}
}

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

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

相关文章

windows设置暂停更新时长

windows设置暂停更新时长 win11与win10修改注册表操作一致 &#xff0c;系统界面不同 1.打开注册表 2.在以下路径 \HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings 右键新建 DWORD 32位值&#xff0c;名称为FlightSettingsMaxPauseDays 根据需求填写数…

降维攻击!PCA与随机投影优化高维KNN

引言&#xff1a;高维数据的“冰山困境” 假设你正在处理一个电商平台的商品图片分类任务&#xff1a;每张图片被提取为1000维的特征向量&#xff0c;100万条数据的距离计算让KNN模型陷入“维度地狱”——计算耗时长达数小时&#xff0c;且内存占用超过10GB。 破局关键&#…

在ubuntu 24.04.2 通过 Kubeadm 安装 Kubernetes v1.31.6

文章目录 1. 简介2. 准备3. 配置 containerd4. kubeadm 安装集群5. 安装网络 calico 插件 1. 简介 本指南介绍了如何在 Ubuntu 24.04.2 LTS 上安装和配置 Kubernetes 1.31.6 集群&#xff0c;包括容器运行时 containerd 的安装与配置&#xff0c;以及使用 kubeadm 进行集群初始…

信刻光盘安全隔离与信息交换系统让“数据摆渡”安全高效

随着数据传输、存储及信息技术的飞速发展&#xff0c;信息安全保护已成为重中之重。各安全领域对跨网数据交互的需求日益迫切&#xff0c;数据传输的安全可靠性成为不可忽视的关键。为满足业务需求并遵守保密规范&#xff0c;针对于涉及重要秘密信息&#xff0c;需做到安全的物…

6.6.5 SQL访问控制

文章目录 GRANT授予权限REVOKE回收权限 GRANT授予权限 GRANT语句可以给用户授予权限&#xff0c;基本格式是GRANT 权限 TO 用户。在授权时&#xff0c;WITH GRANT OPTION是可选项&#xff0c;有此句话&#xff0c;被授予权限的用户还能把权限赋给其他用户。 REVOKE回收权限 RE…

蓝桥真题讲解

目录 第一题 题目链接 题目解析 代码原理 代码编写 本题总结 第二题 题目链接 题目解析 代码原理 代码编写 本题总结 第三题 题目链接 题目解析 代码原理 代码编写 本题总结 第一题 题目链接 题目解析 代码原理 图一 图二 图二中的红色字&#xff0c;请仔…

Allegro PCB元件库文件引起的问题-看不见器件,但是不能预览,也就不能放置了

PCB元件库必须包含PCB&#xff08;.psm, .dra)文件&#xff0c;和PAD&#xff08;.pad)文件 在Allegro里Path设置注意事项&#xff1a; 针对psmpath & padpath会有多个文件夹地址的情况。在放一个新的元件到PCB&#xff0c;需要把对应的元件的PCB & PAD地址都放在第一…

Prompt Engineering for Large Language Models

题目 大型语言模型的快速工程 简介 随着 OpenAI 的 ChatGPT 和 Google 的 Bard 等软件的普及&#xff0c;大语言模型&#xff08;LLM&#xff09;已经渗透到生活和工作的许多方面。例如&#xff0c;ChatGPT 可用于提供定制食谱&#xff0c;建议替换缺失的成分。它可用于起草研…

python-leetcode-使用最小花费爬楼梯

746. 使用最小花费爬楼梯 - 力扣&#xff08;LeetCode&#xff09; 解法 1&#xff1a;动态规划&#xff08;O(n) 时间&#xff0c;O(n) 空间&#xff09; class Solution:def minCostClimbingStairs(self, cost: List[int]) -> int:n len(cost)dp [0] * (n 1) # 额外多…

服务器IPMI用户名、密码批量检查

背景 大规模服务器部署的时候&#xff0c;少不了较多的网管和监测平台&#xff0c;这些平台会去监控服务器的性能、硬件等指标参数&#xff0c;为了便于管理和控制&#xff0c;则需要给服务器IPMI带外管理添加较多的用户&#xff0c;这就需要对较多的服务器检查所对应的IPMI用…

docker-compose部署开源堡垒机Orion-Visor——筑梦之路

git clone --depth1 https://github.com/dromara/orion-visorcd orion-visor docker compose pull# 配置,此处我保持默认cp .env.example .env# 启动进行数据库初始化docker compose up -d# 访问http://[ip]:8081进行登陆Adminer# 依次导入这些初始化sql orion-visor/sql/init-…

【大模型系列篇】DeepSeek开源周,解锁AI黑科技

&#x1f525; Day1&#xff1a;FlashMLA —— GPU推理加速器 专为处理长短不一的AI推理请求而生&#xff0c;就像给Hopper GPU装上了智能导航&#xff0c;让数据在芯片上跑出3000GB/s的"磁悬浮"速度。✅ 已支持BF16格式&#xff5c;580万亿次浮点运算/秒FlashMLA G…

scala基础

Scala基础 scala基础Scala介绍第一个scala代码object和class的区别关键区别伴生类和伴生对象&#xff1a; 字节码解析在java中创建三个类 反编译代码编译User.class源码后的结果编译Emp.class源码后的结果 注释Scala类型推断&至简原则变量var和val之间的区别可变变量不可变…

智能家居遥控革命!昂瑞微HS6621EM:用「芯」定义AIoT时代的语音交互标杆

AIoT爆发期&#xff0c;遥控器为何成为智能家居的「隐形战场」&#xff1f; 随着Meta、苹果等巨头加速布局空间计算&#xff0c;智能家居生态正从「单一设备联网」向「全场景无感交互」跃迁。作为高频使用的入口设备&#xff0c;语音遥控器的性能直接决定用户体验天花板。昂瑞微…

绕过密码卸载360终端安全管理系统

一不小心在电脑上安装了360终端安全管理系统&#xff0c;就会发现没有密码&#xff0c;就无法退出无法卸载360&#xff0c;很容易成为一个心病&#xff0c;360终端安全管理系统&#xff0c;没有密码&#xff0c;进程无法退出&#xff0c;软件无法卸载&#xff0c;前不久听同事说…

MongoDB 笔记

一、基础概念 MongoDB 的特点是什么&#xff1f; MongoDB是一种NoSQL数据库&#xff0c;具有以下特点&#xff1a; 文档存储模型 MongoDB 使用 BSON&#xff08;Binary JSON&#xff09; 格式存储数据&#xff0c;数据以文档的形式组织&#xff0c;类似于JSON对象。文档可以包…

小程序Three Dof识别 实现景区AR体验

代码工程 GitCode - 全球开发者的开源社区,开源代码托管平台 dof

ABAP语言的动态程序

通过几个例子&#xff0c;由浅入深讲解 ABAP 动态编程。ABAP 动态编程主要通过 RTTS (Runtime Type Services) 来实现&#xff0c;包括 RTTI 和 RTTC: 运行时类型标识&#xff08;RTTI&#xff09; – 提供在运行时获取数据对象的类型定义的方法。运行时类型创建&#xff08;R…

【安卓】BroadcastReceiver 动态声明为 RECEIVER_NOT_EXPORTED 后无法接收任何 Intent 的问题

一、问题起因 自 Android 14 (API 级别 34) 起&#xff0c;使用 context.registerReceiver(receiver, filter, flags) 动态注册广播接收器时&#xff0c;必须显式地声明 RECEIVER_NOT_EXPORTED 或 RECEIVER_EXPORTED 。 如果声明为 RECEIVER_EXPORTED &#xff0c;任何第三方应…

unity pico开发二:创建基本的交互

文章目录 导入UnityXR Interaction ToolKit构建基础内容 导入UnityXR Interaction ToolKit 检查一下packagemanager&#xff0c;unityxr interactionToolkit是否自动导入 我们需要升级到一个不超过3.x的版本&#xff0c;因为pico还不支持3.x的内容 然后右侧samples里导入初始…