最短路径-Dijkstra算法板子(java)

自己把Dijkstra的板子整理了一下,也方便自己后续做题,在此做个记录。

Dijkstra基本上都会需要这些变量:

        dist[]:记录各个节点到起始节点的最短权值

        path[]:记录各个节点的上一个节点(用来联系该节点到起始节点的路径)

        start:源点序号

        end:结束顶点序号

        weight[][]:存边的权重

        visit[]:当前该顶点的最短路径是否已求出,即访没访问过

        shortPath[]:存储每一次的最短路径的长度

感觉这些变量到最后还是需要根据题意灵活的舍取吧。

然后简单的解释一下Dijkstra算法的具体思路,也方便后续理解代码。

注意:     1.Dijkstra算法不适合带负权图。

                2.计算单源最短路径问题。

Dijkstra算法的本质其实是贪心,说的通俗易懂点就是以起始点(源点)为中心向外层扩展(bfs),知道扩展到终点为止。

具体的算法过程如下:

        声明一个数组dist[]来保存源点到各个顶点的最短距离,声明一个保存已经找到了最短路径的顶点的集合T。然后初始化的时候,源点u的路径权重被赋值为0,即dist[u] = 0,如果这个顶点u存在能直接到达的边(u,v),就把dist[v]设为weight[u][v],(其中weight[i][j]表示(i,j)这条边的权重),同时把所有其他(u不能直接到达的)顶点的路径长度设为无穷大。初始时,集合T只有顶点s。

        然后,从dist[]中选择最小值,这个最小值就是源点u到该值对应的顶点的最短路径,并且把该点加入到T中,此时我们就完成了第一个顶点的添加,除去源点,我们要加n-1个顶点

        接着,我们需要看看新加入的顶点是否可以到达其他顶点,并且还要看通过该顶点到达其他点的路径长度是否比源点直接到达短,如果短的话,我们就替换这些顶点在dist中的值,也叫松弛操作。之后重复这一步就可以,直到T中包含了图的所有顶点

但是正常做题的时候好像并不会单独创建一个集合去存顶点,一般都是用boolean visit[]数组,标记一下就行吧。

下面是我找到的Dijkstra板子:

public class 迪杰斯特拉 {static int M = 1000; // 表示两个节点之间没有路public static void main(String[] args) {int[][] weight = {{0, M, 10, M, 30, 100},{M, 0, 5, M, M, M},{M, M, 0, 50, M, M},{M, M, M, 0, M, 10},{M, M, M, 20, 0, 60},{M, M, M, M, M, 0}};int start = 0;  // 表示从源点开始// 存储每一次的最短路径的长度int[] shortPath = Dijkstra(weight,start);for(int i = 0;i < shortPath.length;i ++) {// 说明start点到i点没有最短路if (shortPath[i] == M) {continue;}System.out.println("从" + start+ "出发到" + i + "最短距离是:" + shortPath[i]);}}public static int[] Dijkstra(int [][]weight, int start) {int n = weight.length;  // 顶点个数int[] shortPath = new int[n];   // 保存start点到其他各点的最短路径String[] path = new String[n];  // 存储每一步,保存start到其他各点的字符串表示for(int i = 0;i < n;i ++) {path[i] = start + "->" + i;}boolean[] visit = new boolean[n];   // 标记当前该顶点的最短路径是否已求出,1表示已求出// 进行初始化shortPath[start] = 0;visit[start] = true;for(int cnt = 1;cnt < n; cnt ++) {  // 加入其余n-1个节点int k = 0;  // 选出一个距离初始顶点最近的未被标记的点int min = Integer.MAX_VALUE;for(int i = 0;i < n;i ++) {// 表示该点未确定最短路径,并且start到该点有直接连接if (!visit[i] && weight[start][i] < min) {min = weight[start][i];k = i;}}// 把刚刚新选出的顶点标记为以求出最短路径,并且路径长度为minvisit[k] = true;shortPath[k] = min;// 这个时候k作为中转节点,来进一步判断start到未访问的其他顶点的距离for(int i = 0;i < n;i ++) {// 表示由start到顶点i有一条路是经过顶点k的,并且要比start直接到达顶点i的距离要短,然后就更新,也叫松弛操作if (!visit[i] && weight[start][k] + weight[k][i] < weight[start][i]) {weight[start][i] = weight[start][k] + weight[k][i];path[i] = path[k] + "->" + i;}}}for(int i = 0;i < n;i ++) {if (shortPath[i] == M) {continue;}System.out.println("从" + start + "出发到" + i + "的最短路径:" + path[i]);}return shortPath;}
}

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

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

相关文章

PostgreSQL数据库的array类型

PostgreSQL数据库相比其它数据库&#xff0c;有很多独有的字段类型。 比如array类型&#xff0c;以下表的pay_by_quarter与schedule两个字段便是array类型&#xff0c;即数组类型。 CREATE TABLE sal_emp (name text,pay_by_quarter integer[],schedule t…

centos的根目录占了大量空间怎么办

问题 当根目录磁盘不够时&#xff0c;就必须删除无用的文件了 上面的&#xff0c;如果删除/usr 或/var是可以释放出系统盘的 定位占空间大的文件 经过命令&#xff0c;一层层查哪些是占磁盘的。 du -sh /* | sort -rh | head -n 10 最终排查&#xff0c;是有个系统日志占了20…

PostgreSQL存储过程“多态“实现:同一方法名支持不同参数

引言 在传统编程语言中&#xff0c;方法重载&#xff08;同一方法名不同参数&#xff09;是实现多态的重要手段。但当我们将目光转向PostgreSQL数据库时&#xff0c;是否也能在存储过程&#xff08;函数&#xff09;中实现类似的功能&#xff1f;本文将深入探讨PostgreSQL中如…

快速学会Linux的WEB服务

一.用户常用关于WEB的信息 什么是WWW www是world wide web的缩写&#xff0c;及万维网&#xff0c;也就是全球信息广播的意思 通常说的上网就是使用www来查询用户所需要的信息。 www可以结合文字、图形、影像以及声音等多媒体&#xff0c;超链接的方式将信息以Internet传递到世…

Windows玩游戏的时候,一按字符键就显示桌面

最近打赛伯朋克 2077 的时候&#xff0c;不小心按错键了&#xff0c;导致一按字符键就显示桌面。如下&#xff1a; 一开始我以为是输入法的问题&#xff08;相信打游戏的人都知道输入法和奔跑键冲突的时候有多烦&#xff09;&#xff0c;但是后来解决半天发现并不是。在网上搜…

【测试开发】概念篇 - 从理解需求到认识常见开发、测试模型

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;博客仓库&#xff1a;https://gitee.com/JohnKingW/linux_test/tree/master/lesson &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &…

核函数(Kernel function)

核函数 核函数在GPU上进行并行执行 注意: 限定词__global__修饰 [双下划线]返回值必须是void 形式: _global_ void kernel_function( argument arg){ ​ printf(“hello world from the GPU\n”); } void __global__kernel_function( argument arg){ ​ printf(“hello worl…

数据结构与算法:区间dp

前言 区间dp也是动态规划里很重要的一部分。 一、内容 区间dp的根本原理就是把大范围问题分解成若干小范围的问题去求解。一般来讲,常见的用法有对于两侧端点去展开可能性和对于范围上的划分点去展开可能性。 二、题目 1.让字符串成为回文串的最少插入次数 class Soluti…

AI Agent 入门指南:从 LLM 到智能体

AI. AI. AI. 最近耳朵里是不是总是被这些词轰炸&#xff1f;特别是“Agent”、“AI Agent”、“智能体”、“Agentic”…… 感觉一夜之间&#xff0c;AI 就从我们熟悉的聊天框里蹦出来&#xff0c;要拥有“独立思考”和“自主行动”的能力了&#xff1f; 说实话&#xff0c;一…

开启docker中mysql的binlog日志

1.登陆docker服务器,输入docker ps查看服务: 2.进入mysql服务 进入到mysql的服务容器后,输入mysql -u*** -p***登陆 mysql 客户端查看是否开启binlog 输入 : show variables like log_bin; 3.输入quit退出mysql客户端 4.之后在docker的mysql服务容器里查询mysql的配置文件所在…

Kotlin 中 List 和 MutableList 的区别

在 Kotlin 中&#xff0c;List 和 MutableList 是两种不同的集合接口&#xff0c;核心区别在于可变性。 Kotlin 集合框架的重要设计原则&#xff1a;通过接口分离只读&#xff08;read - only&#xff09;和可变&#xff08;mutable&#xff09;操作&#xff0c;以提高代码的安…

【能力比对】K8S数据平台VS数据平台

&#x1f525;&#x1f525; AllData大数据产品是可定义数据中台&#xff0c;以数据平台为底座&#xff0c;以数据中台为桥梁&#xff0c;以机器学习平台为中层框架&#xff0c;以大模型应用为上游产品&#xff0c;提供全链路数字化解决方案。 ✨AllData数据中台官方平台&…

Fastjson 从多层级的JSON数据中获取特定字段的值

使用 Fastjson 的 JSONPath.eval 可以通过 JSONPath 表达式直接定位多层级 JSON 中的目标字段&#xff0c;避免逐层调用 getJSONObject() 的繁琐操作。以下是具体实现方法和示例&#xff1a; 核心思路 通过 JSONPath.eval 方法&#xff0c;传入 JSON 对象&#xff08;或 JSON…

端口安全基本配置

1.top图 2.交换机配置 交换机swa <SWA> system-view [SWA] vlan batch 10 20[SWA] interface GigabitEthernet0/0/1 [SWA-GigabitEthernet0/0/1] port link-type trunk [SWA-GigabitEthernet0/0/1] port trunk allow-pass vlan 10[SWA] interface GigabitEthernet0/0/2 …

hadoop集群建立

建立Hadoop集群的步骤指南 建立Hadoop集群需要系统规划和多个步骤的配置。以下是详细的建立流程&#xff1a; 一、前期准备 硬件需求 多台服务器(至少3台&#xff0c;1主2从) 每台建议配置&#xff1a;至少4核CPU&#xff0c;8GB内存&#xff0c;100GB硬盘 稳定的网络连接(…

从零开始学java--集合类(2)

集合类 目录 集合类 Queue 队列的使用&#xff1a; 双端队列&#xff08;Deque&#xff09; Map和Set 概念&#xff1a; 模型&#xff1a; Map 常见方法说明&#xff1a; 注意&#xff1a; TreeMap和HashMap的区别&#xff1a; Set 常见方法说明&#xff1a; 注…

【HarmonyOS 5】鸿蒙发展历程

【HarmonyOS 5】鸿蒙发展历程 一、鸿蒙 HarmonyOS 版本年代记 鸿蒙 1.0&#xff1a; 2019 年 8 月 9 日&#xff0c;华为在开发者大会上正式发布鸿蒙 1.0 系统&#xff0c;这一版本首次应用于华为荣耀智慧屏产品中&#xff0c;标志着华为正式进军操作系统领域。该版本初步展现…

SpringBoot教学管理平台源码设计开发

概述 基于SpringBoot框架开发的​​教学管理平台​​完整项目&#xff0c;帮助开发者快速搭建在线教育平台。该系统包含学生端、教师端和管理后台&#xff0c;实现了课程管理、随堂测试、作业提交等核心功能&#xff0c;是学习SpringBoot开发的优质案例。 主要内容 1. 系统架…

人工智能端侧热度再起

在科技浪潮汹涌澎湃的当下,人工智能端侧正悄然掀起新一轮的热度风暴。曾经,人工智能更多停留在概念层面,仿佛是遥不可及的未来幻想;而后,它逐渐落地,在特定领域崭露头角,却也显得有些曲高和寡。但如今,人工智能端侧正以前所未有的态势融入我们的生活,从智能手机的语音…

相同的数(简单)

深度优先搜索 如果两个二叉树都为空&#xff0c;则两个二叉树相同。如果两个二叉树中有且只有一个为空&#xff0c;则两个二叉树一定不相同。 如果两个二叉树都不为空&#xff0c;那么首先判断它们的根节点的值是否相同&#xff0c;若不相同则两个二叉树一定不同&#xff0c;…