【算法】迪克斯特拉算法之Java实现

2024-02-15 15:20

本文主要是介绍【算法】迪克斯特拉算法之Java实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 迪克斯特拉算法是带权重的最短路径算法。

算法核心思想:

1. 找出当前距离起点距离最短的点。

2. 遍历该点的所有邻居节点,如果经过该点到邻居节点的距离比邻居原来的距离要更短,则更新邻居的距离。

3. 标记该点为已使用节点,寻找下一个未使用的且距离起点最近的节点。重复1,2操作。

4. 所有的节点都被标记后,最短路径就找到了!

举个例子:

public static void DijkstraAlgorithm() {//初始化最短路径拓扑图List<String> points = Arrays.asList("start", "A", "B", "end");int size = points.size();Object[][] graph = new Object[size][size];graph[points.indexOf("start")][points.indexOf("A")] = 6;graph[points.indexOf("start")][points.indexOf("B")] = 2;graph[points.indexOf("A")][points.indexOf("end")] = 1;graph[points.indexOf("B")][points.indexOf("A")] = 3;graph[points.indexOf("B")][points.indexOf("end")] = 5;//当前节点String currentPoint = points.get(0);//记录所有检查过的点List<String> checked = new ArrayList<>();//记录各个点到起点的距离,下标与points对应Integer[] costs = new Integer[size];//起点到起点的距离为0,其他节点距离暂时未知costs[0] = 0;while (true) {int pointIndex = points.indexOf(currentPoint);System.out.println("当前检查点:" + currentPoint);for (int i = 0; i < graph[pointIndex].length; i++) {//当前节点到邻居的距离Object currentCost = graph[pointIndex][i];//过滤空节点和当前节点if (currentCost == null || i == pointIndex) {continue;}//从当前节点出发,到达邻居节点的距离比邻居节点原来的距离更短,则更新邻居节点的总里程。int newCost = costs[pointIndex] + (int) currentCost;if (costs[i] == null || newCost < costs[i]) {costs[i] = newCost;System.out.println("发现点" + points.get(i) + "更短距离:" + newCost);}}//记录已经检查过的点checked.add(currentPoint);//查找还未检查过的,距离起点最短的点currentPoint = getMinCostPoint(points, checked, costs);//如果当前节点为终点,跳出循环if (currentPoint.equals(points.get(points.size() - 1))) {break;}System.out.println("下一个检查点为:" + currentPoint);System.out.println("--------------------------");}System.out.println("--------------------------");System.out.println("当前最短路径为:" + costs[size - 1]);}private static String getMinCostPoint(List<String> points, List<String> checked, Integer[] costs) {String currentPoint;int index = 0;int length = Integer.MAX_VALUE;for (int i = 1; i < costs.length; i++) {//不含已经检查过的点if (checked.contains(points.get(i))) {continue;}if (costs[i] != null && costs[i] < length) {length = costs[i];index = i;}}currentPoint = points.get(index);return currentPoint;}

运行结果:

当前检查点:start
发现点A更短距离:6
发现点B更短距离:2
下一个检查点为:B
--------------------------
当前检查点:B
发现点A更短距离:5
发现点end更短距离:7
下一个检查点为:A
--------------------------
当前检查点:A
发现点end更短距离:6
--------------------------
当前最短路径为:6

这篇关于【算法】迪克斯特拉算法之Java实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/711765

相关文章

Nginx实现高并发的项目实践

《Nginx实现高并发的项目实践》本文主要介绍了Nginx实现高并发的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录使用最新稳定版本的Nginx合理配置工作进程(workers)配置工作进程连接数(worker_co

python中列表list切分的实现

《python中列表list切分的实现》列表是Python中最常用的数据结构之一,经常需要对列表进行切分操作,本文主要介绍了python中列表list切分的实现,文中通过示例代码介绍的非常详细,对大家... 目录一、列表切片的基本用法1.1 基本切片操作1.2 切片的负索引1.3 切片的省略二、列表切分的高

基于Python实现一个PDF特殊字体提取工具

《基于Python实现一个PDF特殊字体提取工具》在PDF文档处理场景中,我们常常需要针对特定格式的文本内容进行提取分析,本文介绍的PDF特殊字体提取器是一款基于Python开发的桌面应用程序感兴趣的... 目录一、应用背景与功能概述二、技术架构与核心组件2.1 技术选型2.2 系统架构三、核心功能实现解析

使用Java发送邮件到QQ邮箱的完整指南

《使用Java发送邮件到QQ邮箱的完整指南》在现代软件开发中,邮件发送功能是一个常见的需求,无论是用户注册验证、密码重置,还是系统通知,邮件都是一种重要的通信方式,本文将详细介绍如何使用Java编写程... 目录引言1. 准备工作1.1 获取QQ邮箱的SMTP授权码1.2 添加JavaMail依赖2. 实现

Java嵌套for循环优化方案分享

《Java嵌套for循环优化方案分享》介绍了Java中嵌套for循环的优化方法,包括减少循环次数、合并循环、使用更高效的数据结构、并行处理、预处理和缓存、算法优化、尽量减少对象创建以及本地变量优化,通... 目录Java 嵌套 for 循环优化方案1. 减少循环次数2. 合并循环3. 使用更高效的数据结构4

使用Python实现表格字段智能去重

《使用Python实现表格字段智能去重》在数据分析和处理过程中,数据清洗是一个至关重要的步骤,其中字段去重是一个常见且关键的任务,下面我们看看如何使用Python进行表格字段智能去重吧... 目录一、引言二、数据重复问题的常见场景与影响三、python在数据清洗中的优势四、基于Python的表格字段智能去重

java两个List的交集,并集方式

《java两个List的交集,并集方式》文章主要介绍了Java中两个List的交集和并集的处理方法,推荐使用Apache的CollectionUtils工具类,因为它简单且不会改变原有集合,同时,文章... 目录Java两个List的交集,并集方法一方法二方法三总结java两个List的交集,并集方法一

Spring AI集成DeepSeek三步搞定Java智能应用的详细过程

《SpringAI集成DeepSeek三步搞定Java智能应用的详细过程》本文介绍了如何使用SpringAI集成DeepSeek,一个国内顶尖的多模态大模型,SpringAI提供了一套统一的接口,简... 目录DeepSeek 介绍Spring AI 是什么?Spring AI 的主要功能包括1、环境准备2

Spring AI集成DeepSeek实现流式输出的操作方法

《SpringAI集成DeepSeek实现流式输出的操作方法》本文介绍了如何在SpringBoot中使用Sse(Server-SentEvents)技术实现流式输出,后端使用SpringMVC中的S... 目录一、后端代码二、前端代码三、运行项目小天有话说题外话参考资料前面一篇文章我们实现了《Spring

Spring AI与DeepSeek实战一之快速打造智能对话应用

《SpringAI与DeepSeek实战一之快速打造智能对话应用》本文详细介绍了如何通过SpringAI框架集成DeepSeek大模型,实现普通对话和流式对话功能,步骤包括申请API-KEY、项目搭... 目录一、概述二、申请DeepSeek的API-KEY三、项目搭建3.1. 开发环境要求3.2. mav