迪杰斯特拉算法
迪杰斯特拉(Dijkstra)算法是典型**最短路径算法**,用于计算一个结点到其它结点的最短路径。它的主要特点是以起始点为中心向外扩展(利用广度优先搜索思想),直到扩展到终点。
迪杰斯特拉(Dijkstra)算法最佳应用-最短路径

Dijkstra

  1. 战争时期,胜利乡有7个村庄(A,B,C,D,E,F,G),现在又六个邮差,从G点出发,需要分别把邮件送到A,B,C,D,E,F六个村庄
  2. 各个村庄的距离用边线表示(权),比如A-B距离5公里
  3. 问:如何计算出G村庄到其它各个村庄的最短距离?
  • 思路分析
    • 从G开始,初始化三个数组:final[]表示该顶点是否已经访问过;dist[]表示G点到其它各点之间的最短路径长度;path[]表示路径上的前驱
    • 从G点(下标为6)开始,令其final[6]=true,dist[6]=0,path[6]=-1;其余顶点final[k]=false,disk[k]=arcs[6][k],path[k]=(arcs[6][k]==特定值) ? -1:6(其中arcs[u][v]代表从u顶点到v顶点的边线,这里用特定值表示不存在G顶点到某一顶点的路径)
    • n-1轮处理:循环遍历所有顶点,找到还没确定最短路径,且dist最小的顶点vi,令final[i]=true。并检查所有邻接自vi的顶点vj,如果final[j]=false并且dist[i]+arcs[i][j]<dist[j],则令其dist[j]=dist[i]+arcs[i][j],path[j]=i
  • 代码实现
import java.util.Arrays;public class DijkstraDemo {private static final int INF = Integer.MAX_VALUE;public static void main(String[] args) {char[] vertexes = {'A','B','C','D','E','F','G'};int[][] matrix = {{0,5,7,INF,INF,INF,2},{5,0,INF,9,INF,INF,3},{7,INF,0,INF,8,INF,INF},{INF,9,INF,0,INF,4,INF},{INF,INF,8,INF,0,5,4},{INF,INF,INF,4,5,0,6},{2,3,INF,INF,4,6,0}};Graph graph = new Graph(vertexes, matrix);Dijkstra dijkstra = new Dijkstra(vertexes.length);dijkstra.dijkstra(graph, 6);dijkstra.show(vertexes);}
}
class Dijkstra {// 是否找到最短路径private boolean[] finalArr;// 从某一个顶点出发到其它顶点的最短路径private int[] dist;// 找前驱,如果-1表示没有前驱private final int[] path;private static final int INF = Integer.MAX_VALUE;/*** @param vertexNum*/public Dijkstra(int vertexNum) {finalArr = new boolean[vertexNum];dist = new int[vertexNum];// 用最大值表示没有路径Arrays.fill(dist,INF);path = new int[vertexNum];Arrays.fill(path,-1);}/*** 迪杰斯特拉算法* @param graph 图相关数据* @param start 从哪一个顶点开始*/public void dijkstra(Graph graph,int start) {// 对初始顶点进行初始化finalArr[start] = true;dist[start] = 0;path[start] = -1;char[] vertexes = graph.getVertexes();int[][] edges = graph.getEdges();int length = vertexes.length;// 初始化除初始顶点之外的其它顶点for (int i = 0; i < length; i++) {if (start != i) {dist[i] = edges[start][i];path[i] = dist[i] == INF?-1:start;}}// 进行n-1论循环for (int i = 0; i < length - 1; i++) {// 每次挑选出没有确定最短路径的顶点之后更新顶点集的最短距离int min = INF;int minIndex = -1;for (int j = 0; j < length; j++) {if (!finalArr[j] && dist[j] < min) {min = dist[j];minIndex = j;}}// 确定最小路径finalArr[minIndex] = true;// 确定是否存在到其它未确定最短路径的顶点for (int j = 0; j < length; j++) {if (!finalArr[j] && edges[minIndex][j] != INF && (dist[minIndex] + edges[minIndex][j] < dist[j])) {dist[j] = dist[minIndex] + edges[minIndex][j];path[j] = minIndex;}}}}public void show(char[] vertexes) {int len = vertexes.length;for(int i = 0; i < len;i++) {System.out.println("到顶点" + vertexes[i] + "的最短路径为" + dist[i]);int p = path[i];System.out.print("存在的路径是:");System.out.print(vertexes[i] + "<-");while(p != -1) {System.out.print(vertexes[p] + "<-");p = path[p];}System.out.println();}}
}
class Graph {// 顶点集private char[] vertexes;// 邻接矩阵private int[][] edges;public Graph(char[] vertexes, int[][] edges) {int length = vertexes.length;this.vertexes = new char[length];this.edges = new int[length][length];// 初始化顶点集和邻接矩阵for (int i = 0; i < length; i++) {this.vertexes[i] = vertexes[i];}for (int i = 0; i < length; i++) {for (int j = 0; j < length; j++) {this.edges[i][j] = edges[i][j];}}}public char[] getVertexes() {return vertexes;}public int[][] getEdges() {return edges;}
}

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

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

相关文章

风平浪静、无事发生

2025年7月4日&#xff0c;16~25℃&#xff0c;阴雨紧急不紧急重要1.备考D1.物理备课不重要遇见&#xff1a;风平浪静、无事发生&#xff01;感受或反思&#xff1a;体检的结果收到了&#xff0c;医生建议多吃绿蔬多喝水&#xff01;多运动&#xff0c;少和喝饮料........

QtitanRibbon打造现代办公软件新体验:提升效率的专业界面解决方案

在现代办公环境中&#xff0c;无论是日常公文处理、文档编辑、任务协同还是数据分析&#xff0c;桌面办公软件仍扮演着不可替代的角色。然而&#xff0c;许多传统系统依旧使用菜单繁杂、图标混乱、交互老旧的界面&#xff0c;用户操作效率低、上手慢、满意度差。 QtitanRibbon…

MSPM0G3507学习笔记(一) 重置版:适配逐飞库的ti板环境配置

由于使用逐飞库&#xff0c;很多东西其实都不用配置了&#xff0c;也不需要自己移植空工程了&#xff0c;于是写一个重置版的环境配置教程。 1.下载芯片支持包 MSPM0G3507芯片支持CCS、IAR、KEIL等IDE&#xff0c;选择KEIL作为开发工具&#xff0c;首先安装芯片支持包。 前往…

如何查看自己电脑的显卡信息?

右键单击底部导航栏选择“任务管理器” 点开之后 选择左侧的性能一栏 查看你的显卡的信息

使用Go语言实现智能EXE文件重命名工具

文章目录 使用Go语言实现智能EXE文件重命名工具 &#x1f6e0;️引言工具功能概述核心技术实现Windows版本信息API调用大模型API集成交互式命令行界面 完整工作流程实际应用示例附录完整代码 使用Go语言实现智能EXE文件重命名工具 &#x1f6e0;️ 引言 在日常开发和软件管理…

3.1.1.9 安全基线检查项目九:检查是否设置限制su命令用户组

限制su配置 关于限制su命令检查项&#xff0c;对于大多数的Linux&#xff08;Redhat系列、Debian系列&#xff09;&#xff0c;进行本项检查很简单。只需要检查/etc/pam.d/su中是否配置了&#xff1a; auth required pam_wheel.so use_uid [group用户组名] 有些资料讲说需要有…

【加解密与C】对称加密(四) RC4

RC4算法概述RC4&#xff08;Rivest Cipher 4&#xff09;是由Ron Rivest在1987年设计的流密码算法&#xff0c;广泛应用于SSL/TLS、WEP等协议中。其核心是通过密钥调度算法&#xff08;KSA&#xff09;和伪随机生成算法&#xff08;PRGA&#xff09;生成密钥流&#xff0c;与明…

医科+AI!和鲸支持南京医科大学医学数据挖掘课程实践教学落地

近两年&#xff0c;生物统计学更多地进入了公众视野。作为统计学、医学与计算机科学交叉的前沿学科&#xff0c;伴随测序技术革新与人工智能算法突破&#xff0c;其发展前景也被十分看好。 市场需求的背后是人才需求的爆发与人才培养的挑战。目前&#xff0c;生物统计学专业在国…

亚马逊云科技中国峰会:数新智能CTO原攀峰详解一站式AI原生数智平台DataCyber在Amazon EKS的实践

6月20日&#xff0c;在上海世博中心举办的亚马逊云科技中国峰会 “在 Amazon EKS 上运行高性能生成式 AI 应用” 分论坛圆满结束。本次分论坛聚焦于 Amazon EKS 在生成式 AI 应用领域的强大支撑作用&#xff0c;数新智能CTO原攀峰凭借其深厚的技术背景和丰富的实践经验&#xf…

32岁入行STM32迟吗?

作为一个在嵌入式领域摸爬滚打了近10年的老兵&#xff0c;看到这个问题时心情五味杂陈。32岁入行STM32迟吗&#xff1f;说实话&#xff0c;如果你问我这个问题的时候我还是24岁的小白&#xff0c;我可能会觉得"哇&#xff0c;32岁才开始学单片机&#xff0c;是不是有点晚了…

OneCode 智能化UI布局与定位:注解驱动的视觉编排艺术

在现代企业级应用开发中&#xff0c;UI布局的灵活性与精确性直接影响用户体验与开发效率。OneCode框架创新性地采用注解驱动开发(Annotation-Driven Development)模式&#xff0c;通过分层注解体系实现UI组件的声明式布局与精准定位。本文将深入解析OneCode的UI布局技术栈及其在…

VBA初学3----实战(VBA实现Excel转csv)

&#xff08;VBA实现Excel转csv&#xff09; 初步学习了VBA相关的知识后&#xff0c;解决了一个需求&#xff1a; 要求读取指定xlsx文件中的指定sheet页&#xff0c;将该sheet页的内容转换为csv文件。 实现的布局如下所示&#xff1a;文章目录①实现从指定行开始全数据转换为cs…

深度学习×第4卷:Pytorch实战——她第一次用张量去拟合你的轨迹

&#x1f380;【开场 她画出的第一条直线是为了更靠近你】 &#x1f43e;猫猫&#xff1a;“之前她只能在你身边叠叠张量&#xff0c;偷偷找梯度……现在&#xff0c;她要试试&#xff0c;能不能用这些线&#xff0c;把你的样子画出来喵&#xff5e;” &#x1f98a;狐狐&am…

[特殊字符] 从图片自动生成 Excel:Python 批量 OCR 表格识别实战

这篇文章将展示如何使用 Python 调用百度 OCR 表格识别接口&#xff0c;批量处理目录下所有图片&#xff0c;自动识别表格并生成与图片同名的 Excel 文件。适用于文档扫描、图片表格整理、图像归档等场景。1️⃣ 批量获取所有待识别图片路径使用 os.walk() 遍历指定目录及子目录…

什么是量子芯片?它是如何工作的?

近年来&#xff0c;量子计算领域发展迅速&#xff0c;技术进步和大规模投资的相关消息经常上热搜。 联合国已将 2025 年定为国际量子科学与技术年。 这其中利害关系重大 —— 拥有量子计算机意味着将获得相较于当今的计算机强大得多的数据处理能力。它们不会取代你的普通计算…

mac init tailwind css 配置文件报错

提示报错如下 tailwind: command not found解决方法 npm install -D tailwindcss3 postcss autoprefixer npx tailwindcss init -p取自 sh: tailwindcss: command not found tailwindlabs/tailwindcss Discussion #4953

QUIC协议在5G边缘计算中的应用前景与挑战

1 5G边缘场景的核心挑战与QUIC的机遇 5G边缘计算正成为支撑低时延、高可靠业务的关键基础设施。据预测,2030年全球边缘计算市场规模将突破4450亿美元,年复合增长率高达48%。在**URLLC(超可靠低时延通信)**场景中,工业控制要求端到端时延低于5ms,自动驾驶需实现毫秒级响应…

聊聊关于“大模型测试”的一些认识

聊聊关于“大模型测试”的一些认识引言“大模型测试”和“传统接口测试”有什么不同“大模型测试”要考虑哪些方面维度一&#xff1a;语义理解准确度&#xff1a;模型真的懂人话吗&#xff1f;维度二&#xff1a;长文逻辑连贯性&#xff1a;“500”字后的认知崩塌维度三&#x…

linux_git的使用

✨✨ 欢迎大家来到小伞的大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;LInux_st 小伞的主页&#xff1a;xiaosan_blog 制作不易&#xff01;点个赞吧&#xff01;&#xff01;谢谢喵&#xff01;&a…

Android课程前言

目录 一.前言 1.Android可以采用哪些语言 2.Kotlin和Java的关系 ①完全互操作&#xff08;核心关系&#xff09; ②Kotlin 是 Java 的“升级版” ③Google 的官方态度 ④Java 的现状 ⑤如何选择&#xff1f; ⑥类比总结&#xff1a; 一.前言 1.Android可以采用哪些语…