经典算法之图的最短路径(一):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

半导体设备隔振必看:如何用天棚阻尼PID控制实现VC-C级振动抑制(含SIMULINK模型)

本文深入探讨了在半导体精密制造中,如何运用天棚阻尼PID控制算法实现VC-C级振动抑制。通过构建高保真单自由度仿真模型,详细解析了从算法原理、SIMULINK实现到参数整定的全链路方案,并针对谐波扰动提供了陷波滤波器设计方法,为工程师提供了从仿真到实践的完整主动隔振技术指南。

pz89012345的博客 537

基于RTL8367S与XS2184的工业级POE交换机硬件设计全解析

本文深入解析基于RTL8367S与XS2184芯片的工业级POE交换机硬件设计,涵盖核心价值、芯片选型、原理图设计、PCB布局及可靠性验证等关键环节。重点探讨双芯片协同工作优势,如RTL8367S的自适应调度算法和XS2184的智能功率分配功能,为工业环境下的稳定供电与数据传输提供专业解决方案。

weixin_42614269的博客 458

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

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

NinoSun的博客 671

聚类教程:cisTopic——来自单细胞表观基因组学数据的顺式调控主题的概率建模

之前运行这步的时候报错了如下: 后来发现原因是Ubuntu自动把R包更新到4.2版本,但是Rstudio版本没有更新,更新Rstudio即可,更新Rstudio的教程看此教程:。

watermel__的博客 1051

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

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

-琥珀-的专栏 4245

FT601Q芯片深度解析:从USB3.0引脚定义到FPGA FIFO协议实战选型

本文深入解析FT601Q芯片在USB3.0接口设计与FPGA协议栈开发中的应用,详细介绍了USB3.0引脚定义、FT601Q芯片架构、245同步FIFO模式及硬件设计要点,帮助工程师实现高速数据传输系统。

weixin_30607659的博客 447

AI自动打游戏全攻略:从环境搭建到Agent训练实战

本文系统介绍了AI自动打游戏的技术实现方案,重点解析了强化学习(DQN算法)在贪吃蛇游戏中的应用。文章从技术选型入手,对比了强化学习与计算机视觉两种方案,详细说明了开发环境配置步骤,并深入讲解了DQN模型构建、游戏环境封装、训练优化等核心环节。通过经验回放和目标网络等技术,有效提升了AI的学习效率和稳定性。该方案具有通用性,只需调整参数即可应用于其他简单游戏场景,为开发者实现游戏AI提供了完整的技术路径。

milk416666的博客 4124

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

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

u013378580的博客 540

使用3dmax Morpher制作Unity表情动画

关于游戏人物的面部表情动画 方案一:如果面部骨骼数丰富的话,可以直接做骨骼动画 方案二:采用变形器(3dmax是Morpher,maya是blendshape)修改相应通道的权重值来做表情动画 本文简述方案二的做法。 说明:本文截图中3dsMax版本为2017。笔者第一次使用3dsMax,欢迎指正。 3dmax中导入人物模型,选择需要变形的对象,即head。当前对象附带skin信息。 ...

写作帮助思考 2万+

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

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

十二月的猫 1万+

Simlink与PX4硬件在环仿真(HIL)实现

Simlink与PX4硬件在环仿真(HIL)实现 介于涉及的知识比较多,这里只是简单的介绍一下,更多内容可以参考阿木实验室《基于matlab模型开发》课程。 硬件在环HIL介绍 simlink与PX4通信实现 硬件在环HIL介绍 为来贯彻万物都可以用数学公式表示,我们以simlink的角度来看我们的无人机,那么UAV可以分为以下的几个模块: 传感器模型 滤波器模块 控制器模...

Zipout的博客 6210

融合双主干网络提升YOLOv8性能一种基于SOTA思想的目标检测改进

YOLOv8采用了单一的主干网络进行特征提取,通常是基于CSPDarknet作为骨干网络,在目标检测过程中通过不同的卷积层提取不同尺度的信息。虽然这种设计在大多数应用场景下表现出色,但在面对复杂背景、细节丰富的物体或小物体检测时,YOLOv8有时难以保持良好的精度。在本文中,我们提出了一种基于双主干网络的YOLOv8改进方案,通过结合先进的SOTA思想,全面提升了YOLOv8在目标检测任务中的表现。双主干网络架构。

博客 1153

Python 中的图:Dijkstra 算法

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

weixin_53598445的博客 7244

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

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

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

weixin_39448458的博客 2万+

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

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

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

会飞的哼哧的博客 5639

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

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、付费专栏及课程。

余额充值