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

embedded/2025/2/28 23:39:30/

迪杰斯特拉算法(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.ppmy.cn/embedded/168910.html

相关文章

深圳南柯电子|医疗设备EMC测试整改检测:零到一,保障医疗安全

在当今医疗科技飞速发展的时代&#xff0c;医疗设备的电磁兼容性&#xff08;EMC&#xff09;已成为确保其安全、有效运行的关键要素之一。EMC测试整改检测不仅关乎设备的性能稳定性&#xff0c;更是保障患者安全、避免电磁干扰引发医疗事故的重要措施。 一、医疗设备EMC测试整…

Linux | YUM / RPM 常用命令

YUM 与 RPM 常用命令使用指南 YUM 基于 RPM&#xff0c;用于在线管理软件包&#xff0c;能自动解决依赖问题&#xff0c;方便日常使用&#xff1b;RPM 则用于本地软件包管理&#xff0c;需手动处理依赖&#xff0c;适用于特殊场景。使用rpm命令安装/升级软件包时&#xff0c;-…

【UML】统一建模语言 UML 基础

【UML】统一建模语言UML 基础 文章目录 一、概述1.1 - 什么是建模1.2 建模的原则1.3 软件建模的实现过程 二、 UML2.1 UML中10种图 三、用例图3.1 用例之间的关系 —— 泛化关系3.2 用例之间的关系 —— 包含关系3.3 用例之间的关系 —— 扩展关系 四、类图4.1 类的表示方法4.2…

Web安全|渗透测试|网络安全

基础入门(P1-P5) p1概念名词 1.1域名 什么是域名&#xff1f; 域名&#xff1a;是由一串用点分隔的名字组成的Internet上某一台计算机或计算机组的名称&#xff0c;用于在数据传输时对计算机的定位标识&#xff08;有时也指地理位置&#xff09;。 什么是二级域名多级域名…

ES01 - ES基础入门

ElasticSearch基础入门 文章目录 ElasticSearch基础入门一&#xff1a;什么是ElasticSearch1&#xff1a;ELK Stack2&#xff1a;全文搜索引擎3&#xff1a;ES or Sola 二&#xff1a;ES下载安装1&#xff1a;windows安装操作1.1&#xff1a;下载对应的压缩包1.2&#xff1a;全…

ESP32移植Openharmony外设篇(9)NB-IOT

NB-IOT&#xff08;窄带物联网&#xff09; 模块介绍 NB-IoT&#xff08;Narrowband Internet of Things&#xff09;是一种低功耗广域物联网&#xff08;LPWAN&#xff09;技术&#xff0c;专为低功耗、低数据速率和大规模连接的物联网应用而设计。它采用窄带宽信道和低复杂…

Yolo各个系列的模型、ResNet、Pyrimid network、VGG、PointNet、mobilenet模型

YOLO系列模型 YOLO&#xff08;You Only Look Once&#xff09;是一个用于实时目标检测的深度学习模型系列&#xff0c;由 Joseph Redmon 等人提出。 YOLOv1 发布年份 &#xff1a;2015 年 主要特点 &#xff1a; 首次提出将目标检测视为一个回归问题&#xff0c;将输入图像…

内网穿透:打破网络限制的利器

目录 深入理解内网穿透 内网与外网的奥秘 内网穿透的原理剖析 总结与展望 在如今这个数字化时代&#xff0c;网络已经成为我们生活和工作中不可或缺的一部分。但你是否遇到过这样的困扰&#xff1a;在家办公时&#xff0c;想要访问公司内部的文件服务器&#xff0c;却因为网…