漫画:图的最短路径问题

数据结构 c++ 图的最短路径问题 (邻接表) 数据结构 c++ 图的最短路径问题 (邻接表) 数据结构 c++ 图的最短路径问题 (邻接表) 立即下载

 

 

—————  第二天  —————

 

 

 

 

 

 

 

如何遍历呢?

 

第一层,遍历顶点A:

 

 

 

第二层,遍历A的邻接顶点B和C:

 

 

第三层,遍历顶点B的邻接顶点D、E,遍历顶点C的邻接顶点F:

 

 

第四层,遍历顶点E的邻接顶点G,也就是目标节点:

 

 

由此得出,图中顶点A到G的(第一条)最短路径是A-B-E-G:

 

 

 

 

 

换句话说,就是寻找从A到G之间,权值之和最小的路径。

 

 


 

————————————

 

 

 

 

 

 

究竟什么是迪杰斯特拉算法?它是如何寻找图中顶点的最短路径呢?

 

这个算法的本质,是不断刷新起点与其他各个顶点之间的 “距离表”。

 

让我们来演示一下迪杰斯特拉的详细过程:

 

第1步,创建距离表。表中的Key是顶点名称,Value是从起点A到对应顶点的已知最短距离。但是,一开始我们并不知道A到其他顶点的最短距离是多少,Value默认是无限大:

 

 

 

第2步,遍历起点A,找到起点A的邻接顶点B和C。从A到B的距离是5,从A到C的距离是2。把这一信息刷新到距离表当中:

 

 

 

第3步,从距离表中找到从A出发距离最短的点,也就是顶点C。

 

第4步,遍历顶点C,找到顶点C的邻接顶点D和F(A已经遍历过,不需要考虑)。从C到D的距离是6,所以A到D的距离是2+6=8;从C到F的距离是8,所以从A到F的距离是2+8=10。把这一信息刷新到表中:

 

 

 

接下来重复第3步、第4步所做的操作:

 

第5步,也就是第3步的重复,从距离表中找到从A出发距离最短的点(C已经遍历过,不需要考虑),也就是顶点B。

 

第6步,也就是第4步的重复,遍历顶点B,找到顶点B的邻接顶点D和E(A已经遍历过,不需要考虑)。从B到D的距离是1,所以A到D的距离是5+1=6,小于距离表中的8;从B到E的距离是6,所以从A到E的距离是5+6=11。把这一信息刷新到表中:

 

 

 

(在第6步,A到D的距离从8刷新到6,可以看出距离表所发挥的作用。距离表通过迭代刷新,用新路径长度取代旧路径长度,最终可以得到从起点到其他顶点的最短距离)

 

第7步,从距离表中找到从A出发距离最短的点(B和C不用考虑),也就是顶点D。

 

第8步,遍历顶点D,找到顶点D的邻接顶点E和F。从D到E的距离是1,所以A到E的距离是6+1=7,小于距离表中的11;从D到F的距离是2,所以从A到F的距离是6+2=8,小于距离表中的10。把这一信息刷新到表中:

 

 

 

第9步,从距离表中找到从A出发距离最短的点,也就是顶点E。

 

第10步,遍历顶点E,找到顶点E的邻接顶点G。从E到G的距离是7,所以A到G的距离是7+7=14。把这一信息刷新到表中:

 

 

第11步,从距离表中找到从A出发距离最短的点,也就是顶点F。

 

第10步,遍历顶点F,找到顶点F的邻接顶点G。从F到G的距离是3,所以A到G的距离是8+3=11,小于距离表中的14。把这一信息刷新到表中:

 

 

就这样,除终点以外的全部顶点都已经遍历完毕,距离表中存储的是从起点A到所有顶点的最短距离。显然,从A到G的最短距离是11。(路径:A-B-D-F-G)

 

 

按照上面的思路,我们来看一下代码实现:

/**

* Dijkstra最短路径算法

*/

public static Map<Integer, Integer> dijkstra(Graph graph, int startIndex) {

//创建距离表,存储从起点到每一个顶点的临时距离

Map<Integer, Integer> distanceMap = new HashMap<Integer,Integer>();

//记录遍历过的顶点

Set<Integer> accessedSet = new HashSet<Integer> ();

//图的顶点数量

int size = graph.vertexes.length;

//初始化最短路径表,到达每个顶点的路径代价默认为无穷大

for(int i=1; i<size; i++){

distanceMap.put(i, Integer.MAX_VALUE);

}

//遍历起点,刷新距离表

accessedSet.add(0);

List<Edge> edgesFromStart = graph.adj[startIndex];

for(Edge edge : edgesFromStart)

{

distanceMap.put(edge.index, edge.weight);

}

//主循环,重复 遍历最短距离顶点和刷新距离表 的操作

for(int i=1; i<size; i++)

{

//寻找最短距离顶点

int minDistanceFromStart = Integer.MAX_VALUE;

int minDistanceIndex = -1;

for(int j=1; j<size; j++)

{

if(!accessedSet.contains(j) && distanceMap.get(j) < minDistanceFromStart)

{

minDistanceFromStart = distanceMap.get(j);

minDistanceIndex = j;

}

}

if(minDistanceIndex == -1){

break;

}

//遍历顶点,刷新距离表

accessedSet.add(minDistanceIndex);

for(Edge edge : graph.adj[minDistanceIndex])

{

if(accessedSet.contains(edge.index)){

continue;

}

int weight = edge.weight;

int preDistance = distanceMap.get(edge.index);

if(weight != Integer.MAX_VALUE && (minDistanceFromStart+ weight < preDistance))

{

distanceMap.put(edge.index, minDistanceFromStart + weight);

}

}

}



return distanceMap;

}



public static void main(String[] args) {

Graph graph = new Graph(7);

initGraph(graph);

Map<Integer, Integer> distanceMap = dijkstra(graph, 0);

int distance = distanceMap.get(6);

System.out.println(distance);

}



/**

* 图的顶点

*/

private static class Vertex {

String data;

Vertex(String data) {

this.data = data;

}

}



/**

* 图的边

*/

private static class Edge {

int index;

int weight;

Edge(int index, int weight) {

this.index = index;

this.weight = weight;

}

}



/**

* 图

*/

private static class Graph {

private Vertex[] vertexes;

private LinkedList<Edge> adj[];



Graph(int size){

//初始化顶点和邻接矩阵

vertexes = new Vertex[size];

adj = new LinkedList[size];

for(int i=0; i<adj.length; i++){

adj[i] = new LinkedList<Edge>();

}

}

}



private static void initGraph(Graph graph){

graph.vertexes[0] = new Vertex("A");

graph.vertexes[1] = new Vertex("B");

graph.vertexes[2] = new Vertex("C");

graph.vertexes[3] = new Vertex("D");

graph.vertexes[4] = new Vertex("E");

graph.vertexes[5] = new Vertex("F");

graph.vertexes[6] = new Vertex("G");



graph.adj[0].add(new Edge(1, 5));

graph.adj[0].add(new Edge(2, 2));

graph.adj[1].add(new Edge(0, 5));

graph.adj[1].add(new Edge(3, 1));

graph.adj[1].add(new Edge(4, 6));

graph.adj[2].add(new Edge(0, 2));

graph.adj[2].add(new Edge(3, 6));

graph.adj[2].add(new Edge(5, 8));

graph.adj[3].add(new Edge(1, 1));

graph.adj[3].add(new Edge(2, 6));

graph.adj[3].add(new Edge(4, 1));

graph.adj[3].add(new Edge(5, 2));

graph.adj[4].add(new Edge(1, 6));

graph.adj[4].add(new Edge(3, 1));

graph.adj[4].add(new Edge(6, 7));

graph.adj[5].add(new Edge(2, 8));

graph.adj[5].add(new Edge(3, 2));

graph.adj[5].add(new Edge(6, 3));

graph.adj[6].add(new Edge(4, 7));

graph.adj[6].add(new Edge(5, 3));

}

 

 

 

 

 

 

 

2024最新版Anaconda Navigator安装使用指南 本文简要介绍如何下载安装Anaconda Navigator最新版,以及如何使用Python内核搭载来完成应用程序开发。 阅读详情

相关推荐

Linux 命令之 localectl -- 控制系统的本地化与键盘布局

文章目录命令介绍常用选项参考示例(一)显示当前的本地化设置与键盘映射(二)设置系统的本地化字符集环境变量(三)列出本地所有字符集(四)列出所有可用的控制台键盘映射(五)设置控制台的键盘映射 命令介绍 localectl 命令可用于查询与修改系统的本地化(locale)与键盘布局的设置。 它通过与 systemd-localed.service 通信来修改例如 /etc/locale.conf 与 /etc/vconsole.conf 之类的配置文件。本地化设置控制着 用户界面的语言、字符类型与字符编码、 日

liaowenxiong的博客 5393

图论与算法(7)最短路径问题

最短路径问题是指在一个加权图中寻找两个顶点之间的最短路径,其中路径的长度由边的权重确定。:适用于解决单源最短路径问题,即从一个固定的起点到图中所有其他顶点的最短路径。该算法通过不断选择当前路径上权重最小的顶点来逐步扩展最短路径树,直到找到所有顶点的最短路径。:适用于解决带有负权边的图的单源最短路径问题。该算法通过对图中所有边进行松弛操作,反复迭代更新每个顶点的最短距离估计,直到收敛并得到最终的最短路径。:适用于解决图中所有顶点之间的最短路径问题,即多源最短路径问题。

喜欢历史的码农 3640

FPGA可重构技术

介绍FPGA 可重构技术的实现方法,包括全局重构和部分重构

航天领域资深码农,型号经验丰富,一线干货分享 1989

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

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

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

B-Tree数据存储

SQLITE数据存储1. B-Tree的优势  在SQLite中数据库、表、索引都是通过B-Tree和B+Tree的形式进行存储的。如果采用传统的二叉树查找树、红黑树的查找深度一般为log2(N) \log{_2}(N)(其中N表示的是整个树的关键字的数目),在数据库中如果存储的资源过多,就会导致查找一个数据过程中出现较多的磁盘I/O操作,而过多的磁盘操作就会导致整个查找的效率较低,而基于二叉树的一

Promiscuous_youth的博客 1141

ORCAD 层次化原理图使用TCL获取位号的方法

orcad tcl 获取occurrence位号的方法。

m0_46675718的博客 1125

数据结构学习记录——图-最短路径问题(无权图单源最短路径算法、有权图单源最短路径算法、多源最短路径算法、Dijkstra(迪杰斯特拉)算法、Floyd算法)

在算法的每一步,我们将一个顶点加入集合S,该顶点是在当前阶段中距离源点s的最短路径长度最小的顶点。Floyd算法也是逐步地求出最短距离的,通过遍历所有可能的中间节点k,并不断尝试更新D[i][j]的值,Floyd算法逐步优化路径长度,最终找到图中所有节点对之间的最短路径。现在,我们引入一个中间节点k,想要通过节点k来尝试找到更短的路径,即尝试在节点i和节点j之间建立一条路径,其中包括节点k。在每一步中,选择的顶点v是当前阶段中距离源点s最近的顶点,而且该距离是经过已确定最短路径顶点集合S的路径长度。

li13437542099的博客 4575

UE5实现物体高亮描边效果(含UE相关源码浅析)

UE5实现物体高亮描边效果

专注GIS开发 7334

图的最短路径--数据结构

一文搞定最短路径

m0_65768173的博客 2399

FPGA电路设计1——芯片原理图和封装制作流程

本文详细介绍了FPGA电路板设计的学习过程,以Xilinx Kintex-7系列FPGA为例。主要内容包括:1)从官网下载芯片引脚分配文件的方法;2)原理图库绘制流程,重点讲解Bank划分(配置Bank、HR/HP IO Bank、高速收发器Bank)及利用Excel预处理数据;3)使用Altium Designer的Symbol Wizard工具实现引脚自动化导入;4)原理图设计要点,包括电源系统设计(多电压需求与上电时序)、配置电路(JTAG/Flash接口)和时钟设计。

在读研究生,FPGA电路设计与功能开发。 1382

EtherCAT ROS2 入门教程(一)

本文介绍了EtherCAT驱动与ROS2的集成方案,主要包括三部分内容:1)在Ubuntu 22.04上安装IgH EtherCAT主站的详细步骤,包括内核配置、源码编译和网络适配器设置;2)构建ethercat_driver_ros2,通过ros2_control描述文件配置硬件接口和EtherCAT从站模块插件;3)使用方法,包括启动EtherCAT主站和运行配置包。该方案支持通过参数文件定义硬件接口,并提供通用和专用两种EtherCAT模块插件,便于开发基于EtherCAT的工业应用。

机器人控制与仿真应用 1528

数据结构-图详解(最短路径问题-Dijkstra,Bellman-Ford,Floyd-Warshall算法 -C++)

源节点到结点P的代价(代价为0)与P点到adjoinPoint的代价和(5+0和10+0)与源节点到adjoinPoint代价(无穷(默认值))相比要小,根据上面的过程分析,需要将源节点到adjoinPoint的代价更新为源节点到P与P到adjoinPoint的代价之和。第三次,先从Q组找一个起点到源节点路径最小的节点P,P点就是图中的z点。P点相邻的节点有x,s点,源节点到x点距离根据上图可知为14,源节点到P与P到x代价和为7+6=13,两者相比把小的更新到源节点到x代价即可。......

dodamce的博客 2811

手把手教你学Simulink--电机控制架构与算法实现​场景示例:基于Simulink的电机速度环PID调节仿真

本文带你完成了电机速度环PID参数的科学整定,实现了:✅ 理解了速度环的级联系统特性与关键参数影响工程整定法(理论初值)系统辨识法(参数未知时)✅ PID Tuner自动调参(推荐!自动调参兼具快速性与鲁棒性✅ 学会了前馈补偿抗饱和等工程实用技巧。

MHD0815的博客 653

漫画:图的 “最短路径” 问题

————— 第二天 —————如何遍历呢?第一层,遍历顶点A:第二层,遍历A的邻接顶点B和C:第三层,遍历顶点B的邻接顶点D、E,遍历顶点C的邻接顶点F:第四层,遍历...

程序员小灰的博客 1万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

漫画:图的 “最短路径” 问题 | 技术头条

戳蓝字“优快云云计算”关注我们哦!技术头条:干货、简洁、多维全面。更多云计算精华知识尽在眼前,get要点、solve难题,统统不在话下!作者:蠢萌的小灰转自:程序员小灰...

优快云云计算 442

SAP B1中文培訓教材_SDK

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

在图中求一条从顶点 i 到顶点 j 的简单路径_漫画:图的 “最短路径” 问题

————— 第二天 —————如何遍历呢?第一层,遍历顶点A:第二层,遍历A的邻接顶点B和C:第三层,遍历顶点B的邻接顶点D、E,遍历顶点C的邻接顶点F:第四层,遍历顶点E的邻接顶点G,也就是目标节点:由此得出,图中顶点A到G的(第一条)最短路径是A-B-E-G:换句话说,就是寻找从A到G之间,权值之和最小的路径。————————————究竟什么是迪杰斯特拉算法?它是如何寻找图中顶点...

weixin_39669133的博客 549

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

漫画:如何求图的最短路径? | 技术头条

作者 | 程序员小灰 本文经授权转载自程序员小灰(ID:chengxuyuanxiaohui) ————— 第二天 ————— 小灰的思路如下: 第一步,利用迪杰斯特拉算法的距离表,求出从顶点A出发,到其他各个顶点的最短距离: 第二步,继续使用迪杰斯特拉算法,求出从顶点B出发,到其他各个顶点的最短距离。 第三步,从顶点C...

优快云资讯 3833

漫画:图的 “多源” 最短路径

————— 第二天 ————— 小灰的思路如下: 第一步,利用迪杰斯特拉算法的距离表,求出从顶点A出发,到其他各个顶点的最短距离: 第二步,继续使用迪杰斯特拉算法,求出从顶点B出发,到其他各个顶点的最短距离。 第三步,从顶点C出发,到各个顶点的最短距离。 第四步,从顶点D出发........

程序人生的博客 1615

a上标3下标6算法_漫画:Dijkstra 算法的优化

在上一篇漫画中,小灰介绍了单源最短路径算法 Dijkstra,没看过的小伙伴可以看下:漫画:图的 “最短路径” 问题漫画中我们遗留了一个问题:如何求得最短路径的详细节点,而不仅仅是距离?在本篇中,我们将会给与解答。我们仍然以下面这个带权图为例,找出从顶点A到顶点G的最短距离。详细过程如下:第1步,创建距离表和前置顶点表。距离表的Key是顶点名称,Value是从起点A到对应顶点的已知最短距...

weixin_36301419的博客 4460

漫画:Dijkstra 算法的优化

在上一篇漫画中,小灰介绍了单源最短路径算法 Dijkstra,没看过的小伙伴可以看下:漫画:图的 “最短路径” 问题漫画中我们遗留了一个问题:如何求得最短路径的详细节点,...

程序员小灰的博客 2357

漫画:数据结构之最短路径 Dijkstra 算法的优化 | 技术头条

作者小灰,本文经授权转载自程序员小灰(ID:chengxuyuanxiaohui)。 在《漫画:图的 “最短路径” 问题》一文中小灰介绍了单源最短路径算法 Dijkstra。当时漫画中我们遗留了一个问题:如何求得最短路径的详细节点,而不仅仅是距离?——在本篇中,我们将会给与解答。 我们仍然以下面这个带权图为例,找出从顶点A到顶点G的最短距离。 ...

优快云资讯 1379

漫画:数据结构之最短路径 Dijkstra 算法的优化

在《漫画:图的 “最短路径” 问题》一文中小灰介绍了单源最短路径算法 Dijkstra。当时漫画中我们遗留了一个问题:如何求得最短路径的详细节点,而不仅仅是距离?——在本篇中,我们将会给...

优快云人工智能头条 387

Dijkstra 最短路径算法 秒懂 漫画详解

如何遍历呢?第一层,遍历顶点A:第二层,遍历A的邻接顶点B和C:第三层,遍历顶点B的邻接顶点D、E,遍历顶点C的邻接顶点F:第四层,遍历顶点E的邻接顶点G,也就是目标节点:由此得出,图中顶点A到G的(第一条)最短路径是A-B-E-G:换句话说,就是寻找从A到G之间,权值之和最小的路径。————————————究竟什么是迪杰斯特拉算法?它是如何寻找图中顶点的最短路径呢?这个算法的本质,是不断刷新起点...

技术博客 1010

单源最短路径_漫画:数据结构之最短路径 Dijkstra 算法的优化 | 技术头条

作者小灰,本文经授权转载自程序员小灰(ID:chengxuyuanxiaohui)。在《漫画:图的 “最短路径” 问题》一文中小灰介绍了单源最短路径算法 Dijkstra。当时漫画中我们遗留了一个问题:如何求得最短路径的详细节点,而不仅仅是距离?——在本篇中,我们将会给与解答。我们仍然以下面这个带权图为例,找出从顶点A到顶点G的最短距离。详细过程如下:第1步,创建距离表和前置顶点表。距离...

weixin_39869593的博客 104
上一篇: 漫画:深度优先遍历 和 广度优先遍历
下一篇: 漫画:Dijkstra 算法的优化
废言Pro
博客等级 码龄16年 1092粉丝 142原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值