经典算法之图的最短路径(一):Dijkstra算法

图论:Dijkstra算法——最详细的分析,图文并茂,一次看懂! Dijstra算法 阅读详情

Dijkstra算法可以说基本上每一本有讲到图的最短路径的书上都会有的一个算法,但基本上都是讲原理和伪代码,今天自己用Java代码给实现了一下,记录在此。

Dijkstra算法只是解决某些图的最短路径问题,这些图需要满足以下条件:权值非负、有向图。并且该算法只适用于求单源点最短路径,即起始点只是固定的某一个点,当然了,如果想求多源点最短路径,多用几次Dijkstra算法也是能求出来的。

该算法的原理就是:先处理源点,更新一下从源点到每个点的距离以及前结点信息,完后源点放到“已处理”组,从“未处理”组再找一个距离起点最近的点,看下是否有些点的路径在经过这个点后比原来的路径更短了,如果是,那么更新下距离以及前结点信息,如果否,不作操作,完后此点也放入“已处理”组,循环直到所有点都处理完。下面上代码:(最终打印路径的时候偷懒了一下没有把路径倒过来打印)

package classic;

import java.util.Scanner;

public class Dijkstra {

	public static int start = 0;
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.println("输入点和边的数目:");
		int V = sc.nextInt();//总共有多少个点
		int E = sc.nextInt();//总共有多少个边
		
		int[][] G = new int[V][V];//用来存放图的信息
		int[] d = new int[V];//用来存放从起点到每个点的最短路径长度
		int[] pre = new int[V];//用来存放每个点在其最短路径上的前一个结点
		boolean[] used = new boolean[V];
		
		System.out.println("依次输入每条边的起点、终点和权值:(点的编号从0开始)");
		for(int i=0; i<E; i++){
			G[sc.nextInt()][sc.nextInt()] = sc.nextInt();
		}

		for(int i=0; i<V; i++){//初始化d
			pre[i] = start;
			if(i==start){
				d[i] = 0;
				continue;
			}
			if(G[start][i]==0)
				d[i] = Integer.MAX_VALUE/E;
			else{
				d[i] = G[start][i];
			}	
		}

		int cur = 0;
		used[start] = true;

		while(cur<V){
			int minDis = Integer.MAX_VALUE/E;
			int minIndex = 0;
			for(int i=0; i<V; i++){//每次取d[i]最小的那个点
				if(!used[i] && d[i]<minDis){
					minDis = d[i];
					minIndex = i;
				}
			}
			used[minIndex] = true;
			for(int i=0; i<V; i++){
				if(G[minIndex][i]>0 && d[i]>d[minIndex]+G[minIndex][i]){
					d[i] = d[minIndex]+G[minIndex][i];
					pre[i] = minIndex;
				}
			}
			cur++;
		}
		for(int i=0; i<V; i++){
			System.out.println("起点"+start+"到点"+i+"的最短路径长度为:"+d[i]);
			System.out.println("最短路径为:");
			int curv = i;
			System.out.print(i+"<-");
			while(true){
				curv = pre[curv];
				if(curv == start)
					break;
				System.out.print(curv+"<-");
			}
			System.out.println(start);
		}
		sc.close();
	}
}


 

最短路径Dijkstra算法原理及Matlab实现 图论的基础知识不再阐述。 最短路径算法主要有二 Dijkstra算法 Floyd算法 Dijkstra算法研究的是从初始点到其他每一结点的最短路径 而Floyd算法研究的是任意两结点之间的最短路径 以下图为例,首先介绍Dijstra的原理 红字为各结点的编号,蓝字为各结点之间的距离 首先定义几个变量 结点个数n; 二维矩阵M(nxn),距离矩阵,连通的结点间即为距离,不... 阅读详情

相关推荐

【经典算法】 之 Dijkstra算法:求图中任意两顶点的最短路径

Dijkstra算法是图中找任意两点中最短路径的一种经典算法。 重点的步骤总结如下: ①:算法采用了并查集 (之后都叫它为 最短路径顶点集 ):即每次都找离开始顶点距离最短的顶点,然后把该顶点加入最短路径顶点集中(已经加入最短路径顶点集里的那些顶点 下一次就会跳过它了,并且,在顶点集里 任意两个顶点间的距离 都已经是最短) ②:用来记录从源点(开始顶点) 到vi (0<=i<=numVertices) 的最短距离 的数组dist[numVertices] ,并且这个数组的元素值是会不断变化的,为

牛大春の博客 4478

最短路之Dijkstra(15张图解)

Dijstra算法详解

IT OR 考公? 1万+

Dijkstra算法一种用于求解单源最短路径问题的经典算法

Dijkstra算法是解决单源最短路径问题的经典算法,由Edsger W. Dijkstra于1956年提出。它采用贪心策略,逐步扩展已知最短路径集合,适用于非负权重的加权图。算法通过初始化距离数组、优先队列和已处理顶点集合,迭代更新邻接顶点的最短距离。时间复杂度取决于优先队列的实现方式:从O(V²)到O(E+VlogV)。需要注意的是,该算法不能处理负权边。示例展示了从源点A到其他顶点的最短路径计算过程,并附有Python实现代码,使用优先队列优化效率。

qq_39777550的博客 1431

Dijkstra算法图文详解

Dijkstra算法 Dijkstra算法算是贪心思想实现的,首先把起点到所有点的距离存下来找个最短的,然后松弛一次再找出最短的,所谓的松弛操作就是,遍历一遍看通过刚刚找到的距离最短的点作为中转站会不会更近,如果更近了就更新距离,这样把所有的点找遍之后就存下了起点到其他所有点的最短距离。 问题引入: 指定一个点(源点)到其余各个顶点的最短路径,也叫做“单源最短路径”。例如求下图中...

black_hole6的博客 37万+

图-最短路径—Dijkstra算法和Floyd算法

一、Dijkstra算法 1.定义概览:单源最短路径算法 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法是很有代表性的最短路径算法,算法使用了广度优先搜索解决赋权有向图或者无向图的单源最短路径问题,算法最终得到一个最短路径树。该算法常用于路由算法或者作为其他图算...

凌凌小博客 2006

Dijkstra的最短路径算法

Given a graph and a source vertex in the graph, find shortest paths from source to all vertices in the given graph. Dijkstra’s algorithm is very similar to Prim’s algorithm for minimum spanning tree. ...

weixin_41697507的博客 2万+

数据结构与算法——图最短路径

1 引言  最短路径问题一直是图论研究的热点问题。例如在实际生活中的路径规划、地图导航等领域有重要的应用。关于求解图的最短路径方法也层出不穷,本篇文章将详细讲解图的最短路...

程序员吴师兄的博客 1万+

Dijkstra算法最短路径搜索的经典算法

原理和核心思想:Dijkstra算法是一种解决单源最短路径问题的经典算法。其核心思想是通过贪心策略逐步确定从源节点到所有其他节点的最短路径,直到所有节点都被覆盖。算法实现:Dijkstra算法的实现包括初始化距离、使用优先队列动态选择下一个要处理的节点、更新距离等步骤。通过合理的数据结构和算法设计,可以有效地计算出最短路径。适用条件:Dijkstra算法适用于处理非负权重图的最短路径问题。它在网络路由、地图路线规划、资源分配等领域有广泛的应用。复杂性和局限性。

一键难忘的博客 1376

【茶话数据结构】查找最短路径——Dijkstra算法详解(保姆式详细图解,步步紧逼,保你学会)

复习到离散数学图论时,想起来这个算法,感觉很有写博客的必要!今天这篇博客就来讲一下查找最短路径的Dijkstra算法。 Dijkstra 算法,是由荷兰计算机科学家 Edsger Wybe Dijkstra 在1956年发现的算法,戴克斯特拉算法使用类似广度优先搜索的方法解决赋权图的单源最短路径问题。Dijkstra 算法原始版本仅适用于找到两个顶点之间的最短路径,后来更常见的变体固定了一个顶点作为源结点然后找到该顶点到图中所有其它结点的最短路径,产生一个最短路径树。本算法每次取出未访问结点中距离最小的

陈大大陈的博客 8355

Windows 10下Gpg4win 4.3.1安装与配置全攻略:从下载到邮件加密实战

本文详细介绍了在Windows 10系统下安装和配置Gpg4win 4.3.1的全过程,包括下载、验证、自定义安装以及密钥管理。特别重点讲解了如何通过Kleopatra证书管理器进行密钥创建和管理,以及在Outlook中实现邮件加密的实战操作,帮助用户全面提升数据安全防护能力。

weixin_29271263的博客 301

遥感卫星影像AI数据集格式规范详解、技术原理与数据生产全流程技术手册

本技术手册旨在系统性地梳理遥感卫星影像AI数据集的各类格式标准(涵盖VOC、COCO、YOLO及遥感专用DOTA格式等),深入剖析其背后的技术原理,并详细阐述数据生产的全过程,涵盖预处理、标注、质量控制及数据增强等关键环节。无论您是刚入门的算法工程师,还是资深的数据生产管理者,本手册都将为您提供详实的参考与指引。

panshengwu的博客 1127

最短路径问题——Dijkstra算法的理解

1、最短路径的概念 从一个顶点到另一个顶点所经过的边的权重和最小的一条路径,即最短路径。 Dijkstra算法通常用来解决无负权边的图的最短路径问题,算法复杂度O(Elog(V))。 2、算法思路 首先在图中任意选定好顶点,比如0。创建一个数组(最好是最小索引堆),其用来存储与顶点0相连的点的最短距离。由第一张图可以看出,目前除了0点本身距离为0,其他的顶点距离都还没记录。不急。 第二步,我们从...

NinoSun的博客 671

Linux命令行入门:从零掌握服务器运维与Shell脚本基础

在信息化时代,操作系统是数字世界的基石,而终端命令行则是高效驾驭服务器的核心技能。无论是软件部署、服务监控还是故障排查,掌握基于Shell的指令操作都能大幅提升工程效率。从最基础的文件目录管理、文本处理,到权限控制、进程监控与网络调试,命令行提供了一套强大且可自动化的操作范式。尤其对于运维工程师和开发者而言,理解管道、重定向以及脚本化任务,意味着将重复劳动转化为可复用的自动化流程。本文从环境准备讲起,系统梳理常用Linux命令的实际场景与输出验证,并延伸至Shell脚本编写与定时任务,帮助初学者快速建立从操

weixin_30522983的博客 255

最短路径算法Dijkstra算法(迪杰斯特拉算法)

最短路径算法Dijkstra算法(迪杰斯特拉算法) 算法过程 算法思想 个人理解 其实就是借住已知的最短路径求下一条最短路径 不断更新起始点到各个定点的最短距离

-琥珀-的专栏 4245

别再只用真彩色了!手把手教你用ENVI主成分分析(PCA)给遥感图像‘美颜’与‘瘦身’

本文详细介绍了如何利用ENVI主成分分析(PCA)技术优化遥感图像处理,实现数据‘美颜’与‘瘦身’。通过PCA的维度压缩、噪声分离和特征增强三大优势,显著提升高光谱数据的可视化效果和分析效率。文章还提供了ENVI操作的最佳实践和常见问题解决方案,帮助读者掌握这一遥感图像处理的游戏规则改变者。

weixin_28465009的博客 275

python3.12 在用django5.0创建超级用户时,遇到AttributeError: module ‘hashlib‘ has no attribute ‘pbkdf2_hmac‘的问题

产生问题的原因是python3.12的hashlib没有自带pbkdf2_hmac函数,该函数是加密算法的一种,只要通过别的函数导入pbkdf2_hmac即可。还有一种方法是将django默认使用的pbkdf2_hmac改为hashlib自带的sha2或其他算法返回加密的密码,笔者以后会尝试用此类办法解决问题。2.找到报错文件的位置/usr/local/lib/python3.12/site-packages/django/utils/crypto.py。保存修改的文件,重新执行创建超级用户的命令成功。

weixin_67057943的博客 852

数据结构之最短路径(DijKstra)

Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低。     Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,比如数据结构、图论、运筹学等。     1、算

u013378580的博客 540

DeepSeek赋能公文写作:从高效成文到精准传情的全维度指南

摘要:AI赋能公文写作的精准化实践 公文写作长期面临框架混乱、素材匮乏、表达不规范、修改低效等痛点。DeepSeek等AI工具通过"精准指令+分步赋能"模式实现突破:首先明确公文的目的性、逻辑性和规范性特征;其次采用包含场景、类型、目的等要素的指令模板;再分四步实施:框架搭建确保层次分明,内容填充解决素材问题,表达优化适配不同语体,合规校验把关格式规范。典型案例显示,AI能将数据罗列转化为"数据+成果+价值"的生动表述,使公文既规范又具感染力。这种AI赋能的写作方法显

通俗易懂学IT 231

【经典算法】最短路径算法——Dijkstra

最短路径算法是图论中一类重要算法,其功能就如名字一样——求解点与点之间最短距离。首先,先让我们对最短路径算法有一个概观,看看都有哪些种类的最短路径算法,每一个种类中代表的算法又是什么。​从一个起点出发求解其到其他所有其他点的最短距离从所有点出发求解其到其他所有其他点的最短距离动态规划做出的结果在一次次循环中会发生改变;贪婪算法每次做出的结果(局部最优)就是全局最优,不会再发生改变迪杰斯特拉算法是由荷兰计算机科学家在1956年发现的算法,此算法使用类似广度优先搜索的方法解决了带权图的单源最短路径问题。

十二月的猫 1万+

国科大学习资料--图像处理(彭思龙、杨戈)--2020年期末考试题解析(学长整理分析)

在对20年卷子分析前,先看看19年卷子的解析(后面有20年的变化,由于从核心课调整到了普及课,20年的卷子相对简单,但是还是有很多细节) 解析:(字写的不好别嫌弃!!!!) 20年的卷子 第一题:和19年基本一致,但是加了高斯核计算费用,要算一个节省计算成本比率,所以去多看看PPT 第二题:和19年基本一致,加了证明两个高斯卷积仍然是高斯卷积,相当于19年题2和3结合 第三题:采样定理,和19年基本一致,但要注意加了证明 第四题:考了形态学提取图像边界 第五题:直方图,和19年一

无名何许人的博客 4364

小红书图文笔记图像批量爬取:Python爬虫实战与反反爬策略全解析

在当今社交媒体盛行的时代,小红书作为中国领先的生活方式分享平台,积累了海量的优质图文内容。对于数据分析师、市场研究人员或内容创作者来说,能够高效获取这些数据具有重要意义。本文将详细介绍如何使用Python构建一个高效、稳定的小红书图文笔记图像批量爬取工具,涵盖最新技术栈和反反爬策略。本文详细介绍了如何使用Python构建一个高效、稳定的小红书图文笔记图像批量爬取系统。通过结合Playwright、aiohttp等现代工具,实现了从列表页采集到图片下载的完整流程。

2201_76125261的博客 2363

Python 中的图:Dijkstra 算法

介绍   图是最有用的数据结构之一。它们可用于对几乎所有事物进行建模——对象关系和网络是最常见的。图像可以表示为网格状的像素图,句子可以表示为单词的图。图表被用于各个领域,从制图到社会心理学,当然它们在计算机科学中也被广泛使用。因此图搜索和遍历起着重要的计算作用。Dijkstra 算法旨在找到 图中节点 之间的最短路径。它是由荷兰计算机科学家 Edsger Wybe Dijkstra 于 1956 年在思考从鹿特丹到格罗宁根的最短路线时设计的。Dijkstra 算法 多年来一直在发生变化,并且存在各种版本和

weixin_53598445的博客 7244

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

算法:通过迪杰斯特拉(Dijkstra)算法,求出图中任意顶点到其他顶点的最短路径

请看如下的示例图,该图有 V1-V7 七个顶点,每个顶点之间的距离、路径走向如图所示: 假设这是一幅地图,我们很多时候都需要搜路径,比如从家到公司的路线图(也就是说,家是一个点,公司是另一个点)。上图的各个点可以想象成分岔路口。当然,如果你不在分岔路口,你在某条路上,也可以理解为你在一个有两条路的分岔路口上,也就是向前行或者向后退。由于有单行道的存在,所以有的路是只能单向通行的(本示例图全部为单...

weixin_39448458的博客 2万+

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

python实现Dijkstra算法--最短路径问题

本文借鉴于张广河教授主编的《数据结构》,对其中的代码进行了完善。 从某源点到其余各顶点的最短路径 Dijkstra算法可用于求解图中某源点到其余各顶点的最短路径。假设G={V,{E}}是含有n个顶点的有向图,以该图中顶点v为源点,使用Dijkstra算法求顶点v到图中其余各顶点的最短路径的基本思想如下: 使用集合S记录已求得最短路径的终点,初始时S={v}。 选择一条长度最小的最短路径,该路径的...

会飞的哼哧的博客 5639

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

python 经典算法之--最短路径算法(Shortest Path Algorithm)

Bellman-Ford算法中,对于一条边(u, v),先从源点s到u的最短路径dist[u]已经求得,通过松弛操作,可以尝试更新从源点s到v的最短路径dist[v],如果更新成功,则表示有一条更短的路径从源点s到v。Bellman-Ford算法中,对于一条边(u, v),先从源点s到u的最短路径dist[u]已经求得,通过松弛操作,可以尝试更新从源点s到v的最短路径dist[v],如果更新成功,则表示有一条更短的路径从源点s到v。最短路径算法是一类算法,用于寻找图中两个节点之间的最短路径。

qq_42852699的博客 6523

图 —— 最短路径(一)Dijkstra算法

目录1、最短路径概念2、Dijkstra最短路算法图解3、求最短路径的简单代码(1)如果要求打印出指定起点到其他各点的最短路径长度(2)如果要求打印出指定起点到其他各点的最短路径 即连路径也要打印出来 1、最短路径概念 最短路径就是图中两点之间经过的最短距离(就是最小权值),图必须是带有权值的,可以是无向可以是有向的, 算法具体的形式包括: 确定起点的最短路径问题:即已知起始结点,求最短路径...

中都 2559
上一篇: 经典算法之0-1背包问题
下一篇: 经典算法之图的最短路径(二):Bellman_Ford算法
热血大婶
博客等级 码龄16年 58粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

热血大婶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值