解析dijkstra求最短路径

非负权值有向图上的单源最短路径算法之Dijkstra算法 问题的提法是:给定一个没有负权值的有向图和其中一个点src作为源点(source),求从点src到其余个点的最短路径及路径长度。求解该问题的算法一般为Dijkstra算法。 假设图顶点个数为n,则针对其余n-1个点需要分别找出点src到这n-1个点的最短路径。Dijkstra算法的思想是贪心法,先找出最短的那条路径,其次找到次短的,再找到第三短的,依次类推,直到找完点src到达其余所有点的最短路 阅读详情

           其实求最短路径的算法有很多种,现在我先解析下第一种:dijkstra算法。用这个算法来求最短路径的前提是每条边都必须为大于等于0的边,如果相求小有于零的边的最短路径,则可选择其他一个非常经典的算法来求,在这里就不多说了,如果你学过图论,那你一定知道是那个算法。无论是有向图还是无向图,他们都适用dijkstra算法适用求解最短路径,这个一定要知道。

           其实对于一个新人来说,图论是一个非常难懂得东西,所以入门非常支吃力,当然也不排除一些高手们,这些基本算法了如指掌。在此之前,你可能也会只会求图的最段路径,只有开始节点v0,没有结束节点或者节点为最后一个Vn-1.但是你看过这个算法改进之后,你想求哪两个节点的最短路径就求哪两个。废话少说,其实用dijkstra算法来求最短路径可以看做只有三步:一、取第一个点,即开始那个点;二、取第二个点;三、取第三个点。最后就这么循环,得到两个节点最短路径的数组,这个数组保存个节点的最近前缀。

          按照dijkstra算法的基本步骤,如下:

:

          我们可以从步骤中看出,其实就是取三点中其中两点到达第三点的最短路径的那个点。现在我们的问题是去想办法怎么找出那三个点来比较而已。所以这样一想就简单多了,就是找三个点而已吧。接下来,我们要找的点是符合一些限制条件的:!s[k] && arc[u][k]<maxm && dist[u] + arc[u][k] < dist[k]。所以接下来还差一部分,怎么去找第二个点和第三个点。而第一个点是定好的了。

        1、 找第二个点就是在第一个点的基础上,找出和第一个点有路径的并且取值最小的点,这样一来,我们就可以把这个想成查找最小值得办法了。因此这部就简单多了。

        2、接下来怎么着第三个点呢?其实大家都知道,找和第一个点和第二个点都有关系的点(都可达的),所以,这样第三个点也出来了。

        3、最后就是判断第一个点直接到第三个点的距离近还是第一个点经过第二个点再到第三个点的距离近。最后取离第三个点最近的前缀加入集合。这样一来就ok了,最后就得到最短路径的数组,这个数组保存个节点的最近前缀。

       4、通过终点倒过来查找是否有路径到达第一个点,最后就可以得到所求最短路径了。

算法如下:

//本提认为顶点自己是没有回环路的,即自己不可达,注意:数组path保存的是该节点的前面一个节点,这个很重要,必须注意!!
#include<stdio.h>
#include<stdlib.h>
#define maxm 100000//无限大权值,表示不可达
#define maxn 20//最大定顶点数
int arc[6][6] = {
		0, 2, 10, 0, 0,0,
	    0,0, 0, 0, 8 ,0,
	    0, 0, 0,10, 0 ,0,
	    0, 0, 0, 0, 10 ,0,
		0, 0, 0, 0,0,10,
	    0, 0, 0,0, 0,0
	    };//初始化邻接矩阵
int path[maxn],s[maxn],dist[maxn],pathr[maxn];//遍历路径、标志顶点是否加入、始点到个点的距离、需找路径,本体倒过来存储
void dijkstra(int n,int v,int endv)
{
	for (int i = 0; i < n; i++)//将为零的边,即不可达的边权值给最大值,这部其实可设略,不过下面要有所改动,将<maxm改为>0即可
	{
		for (int j = 0; j < n; j++)
		{
			if (arc[i][j] == 0) arc[i][j] = maxm;
		}
	}
	for (int i = 0; i < n; i++)//初始化始点到各店的距离,并保存在dist数组中,将标志位s初始化为零,从v到各点的路径可达则给各前缀定为v,若不可达则值为-1
	{
		dist[i] = arc[v][i];
		s[i] = 0;
		if (i!=v && dist[i]<maxm)
		{
			path[i] = v;
		}
		else
		{
			path[i] = -1;
		}
	}
	//选取第一个点
	s[v] = 1; dist[v] = 0;//首先将v假如路径集合中,开始时距离为0,并将v标志为改变
	for (int i = 0; i < n-1; i++)
	{
		int min = maxm, u = v;
		for (int j = 0; j < n; j++)
		{
			//其实这里是选取第二个点
			if (!s[j] && dist[j] < min)//寻找从v到相邻并没加入集合path的节点的最短路径的节点
			{
				u = j;
				min = dist[j];
			}
		}
		s[u] = 1;//将第二个点加入集合
		//接着选取第三个点
		for (int k = 0; k < n; k++)
		{
			if (!s[k] && arc[u][k]<maxm && dist[u] + arc[u][k] < dist[k])//取最短的节点路径,将前缀加入集合path
			{
				dist[k] = dist[u] + arc[u][k];
				path[k] = u;
			}
		}
	}
	if (path[endv] == -1)//排除自己可达自己
	{
		printf("该点不可达!");
		return;
	}
	int t = 1;
	int e = endv;
	pathr[0] = endv;
	while (path[endv] != v)//通过邻接表查找最短路径
	{
		pathr[t++] = path[endv];
		endv = path[endv];
	}
	pathr[t] = v;
	for (int i = t; i > 0;i--)//将路径输出,如果输出权值为零,则说明不可达
	{
		printf("%d->",pathr[i]);
	}
	printf("%d:%d\n", pathr[0],dist[e]);
	
}
int main()
{
	dijkstra(6,0,6);
	system("pause");
	return 0;
}



算法设计与分析——Dijkstra算法 Dijkstra算法、单源点最短路径算法、最短路径算法、连通图中寻找最短路径、C语言算法、JavaScript算法、算法导论 阅读详情

相关推荐

西门子200SMART PID温控实战:从配置到避坑(附加热棒控制案例)

本文详细介绍了西门子200SMART PLC在PID温控系统中的实战应用,涵盖硬件配置、PID参数整定及工程避坑技巧。通过加热棒控制案例,重点解析了信号处理、固态继电器选型、断电保持和无扰切换等关键问题,为工业自动化领域的温度控制提供可靠解决方案。

weixin_28727975的博客 357

Dijkstra算法图解

最短路径问题 从图中的某个顶点出发到达另外一个顶点的所经过的边的权重和最小的一条路径,称为最短路径。 Djikstra算法 算法特点:Dijkstra算法适用于计算正权图(边权为正)上的单源最短路,即从单个源点出发,到所有节点的最短路。该算法同时适用于有向图和无向图。 算法思路:从已确定最短路径的节点Vi出发,找到其中权值最小的边,如果原点到Vi的权值和加Vi到Vj的权值小于已知原点到Vj的权值和,则将原点到Vi的权值和加Vi到Vj的权值作为原点到Vj的最小权和。(讲的有点不是特别清楚,看图分析)

lllllan 2968

Fastp实战指南:高效处理fastq数据的质控技巧

本文是Fastp实战指南,详细介绍了如何使用Fastp工具高效处理fastq数据的质控技巧。从数据清洗的必要性、基础命令解析,到高级参数定制、UMI数据处理及批量自动化流程,提供一站式解决方案。Fastp以其“All-in-One”的快速质控能力,帮助用户确保测序数据质量,为后续生物信息学分析奠定可靠基础。

weixin_29254029的博客 391

正权图的最短路径算法:Dijkstra算法

概念 Dijkstra算法用于解决无向图或者有向图(有环无环皆可)中起点到各个顶点的最短路径,前提是该图的所有边权必须大于等于0。如果图的边有负权值,就需要用到Bellman-Ford算法。本篇博客仅介绍Dijkstra算法。 Dijkstra算法是基于贪心思想的算法。具体过程是: 将图中节点从0~n标号,定义起点为0。 定义一个数组way,长度为n + 1,记录从起点到某个点的最小距离。并将数...

APlus 1901

解决SolidWorks启动报错问题:SolidWorks2020显示无法获得下列许可 SolidWorks standard 期望的SolidWorks监控程序已经关闭(-97,121,0)

解决SolidWorks启动报错问题:SolidWorks2020显示无法获得下列许可 SolidWorks standard 期望的SolidWorks监控程序已经关闭(-97,121,0) 问题描述 打开SolidWorks2020时,显示SolidWorks2020显示无法获得下列许可 SolidWorks standard 期望的SolidWorks监控程序已经关闭(-97,121,0) (急需看模型的我心里万马奔腾…) 截图如下: 有问题咱就上 看了其他博主的回答,自己尝试了几个,发现出现了新的

qq_44606358的博客 7万+

AutoSAR配置视频讲解:简介

AutoSAR实验视频讲解:闪烁一颗LED实验【简介】 大家好,欢迎来到雪云飞星的《AutoSAR实验课的视频讲解》专栏。看过《AutoSAR入门到精通系列讲解》的朋友们应该对博主不陌生,有很多朋友加了博主的微信成为了好友,还有朋友约过线下见面,博主很高兴大家能从我的博客中获得一些收获。在专栏里博主挖了很多坑,当时也说过想要录制一个AutoSAR的配置视频教程,素材在20年初就已经录好,中间各种原因足足鸽了一年。当时因为一些技术原因只能通过博客的图文形式展示出来,现在我们剪辑了视频,请了专业的配音,希望以视

雪云飞星的博客 9656

Python实现dijkstra算法

Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。注意该算法要求图中不存在负权边。问题描述在无向图G=(V,E)中,假设每条边E[i]的长度为w[i],找到由顶点V0到其余各点的最短路径。(单源最短路径)......

一个专注于机器学习基础与实战的技术博客,内容涵盖算法推导、模型实现、数学原理与代码实践。用通俗的语言解析复杂概念,记录学习过程中的思考与总结,适合机器学习爱好者和从业者参考。 1万+

2篇1章1节:数据的基本概念以及 R 中的数据结构、向量与矩阵的创建及运算

本文详细介绍了R语言中常见的数据结构的向量和矩阵。通过掌握这些数据结构的基本概念和操作技巧,可以更高效地处理和分析数据。

MD Code 1245

详解Dijkstra算法(含数学证明和优化)

Dijkstra算法简介:Dijkstra算法是由荷兰计算机科学家Edsger Wybe Dijkstra于1959年提出的一种解决有向加权图中单源最短路问题的算法,其中要求加权图中不可有负权边。 Dijkstra算法步骤演示 算法数学证明 Dijkstra算法优化

代码火葬场 2万+

把冷门数据从内存里请出去:ABAP 环境下玩转 SAP HANA Native Storage Extension (NSE) 的开发者实战笔记

摘要:SAP HANA NSE技术为ABAP系统提供了一种经济高效的温数据管理方案。文章首先指出企业数据存在"温度分层"现象,高频访问的热数据需常驻内存,而低频温数据更适合存储在磁盘或闪存。NSE通过混合列存架构,将不常访问的数据移至磁盘但仍保持数据库内统一管理,显著降低内存成本。 关键实施要点包括:在ADT技术设置中将Load Unit设为"Page Enforced"以启用NSE;理解buffer cache作为数据"抽屉"的工作原理;掌握选表

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 164

无需SLAM建图,直接生成Gazebo仿真环境的二维代价地图的功能包pgm_map_creator适配ROS Noetic编译报错及解决方法

在ROS Noetic中,使用`pgm_map_creator`功能包直接生成Gazebo仿真环境的二维代价地图时,可能会遇到各种编译和运行错误。本篇博客详细解析了在适配ROS Noetic过程中常见的报错及其解决方法,包括Boost文件结构更新、C++版本兼容性、Gazebo函数名变更、链接库缺失以及protobuf文件加载错误。通过逐步排查和修改,如更换头文件路径、调整C++标准、更新CMakeLists.txt文件等,成功解决了这些问题,使得`pgm_map_creator`功能包能够顺利编译和运行。

慕羽★的博客 2261

Dijkstra算法

Dijkstra算法 是一种单源点最短路算法求出一个点到其他所有点的最短路。 给你这样的一个图,需要求出1号点到其他点的最短距离是多少。   首先我们开一个数组 d[N],d[x] 代表着从起点出发到x点的距离是多少。 开一个数组vis[N], vis[x]数组代表着某个点d[x]是不是成为定值,不会再变小了。 然后我们在开一个数组,edge[N][N],edge[a][b] 代表着...

无限迭代中...... 1104

读懂 SAP S/4HANA 里的 SAP Fiori 架构:前端服务器、搜索链路、传统应用接入与内容组织全景解析

摘要:SAP Fiori架构并非简单的系统连接图,而是明确区分界面层与业务数据层的三层分工体系:用户交互层(浏览器与Fiori launchpad)、前端技术层(SAPUI5运行环境)和业务数据层(SAP S/4HANA后端)。这种分离实现了生命周期解耦,前端专注于统一体验治理,后端处理核心业务逻辑。值得注意的是,SAP Fiori front-end server本质仍是ABAP系统,负责UI技术组件运行。虽然SAP S/4HANA推荐嵌入式部署,但独立部署在多系统场景中仍有价值。典型Fiori应用通过O

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 180

Dijkstra算法求最短路径解析

问题描述 假设你是一个想环游世界的穷孩子,现在好不容易攒了些钱,想要去很多城市。但是由于资金有限,你得尽量找便宜的交通方式。但有的城市从你家根本不能直达,有些城市你从家坐高铁就能直达,有些城市从你家到那里只有飞机。现在你知道了许多城市之间的交通费,想要到目的地去,除了直达还能转车。转车比飞机便宜啊!所以你精打细算想看看从你家到各城市的最便宜的交通方式,这时候有一个叫Dijkstra的...

weixin_30394633的博客 675

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

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

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

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

图解Dijkstra算法,让你了解Dijkstra算法的每一步是怎么进行的

在夜里行走的博客 13万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

求最短路径的3种基本方法

求最短路径的3种基本方法 情景简述:n个城市,m条道路,已知每条道路的长度。 1.多源最短路:Floyd-Warshall算法 2.单源最短路:Dijkstra算法 3.1解决负权边:Bellman-Ford算法 3.2Bellman-Ford的队列优化 总体思路就是:借助中间中间城市 来使得该城市相连的两个城市的路径变短。(就好比A要找C办事,但A不认识C,处理事情就相对麻烦。但A认识B, B认...

weixin_43414130的博客 2万+

Dijkstra算法求 最短路径

1.问题 对于下图使用Dijkstra算法求由顶点a到顶点h的最短路径,按实验报告模板编写算法。 2. 解析 设置集合,把顶点集合V分成两组S V,已求出的顶点(最短路径的顶点)的集合为S,未确定的顶点集合为v。 初始化 依次选取最短路径点的情况下: 3.设计 //先输入边长 for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { scanf("%d",&aaa[i][j] ) ; } } for (w

ftp125的博客 1294

关于求最短路径算法Dijkstra+堆优化的一些粗略讲解(模板)

用途 Dijkstra算法适用于求无负权边的图中点到点的最短路径问题,不可用于有负权边的图中。 算法的基本思想 选定一个初始点,在后续求得的距离也都是到这点的距离。 用 dis[] 数组来表示初始点到当前点的最短距离 遍历当前点连通的所有点,如果当前点满足条件,则更新当前点的 dis[] ,这一步称为 松弛 同时,将当前点最短距离和点的编号压入小根堆(距离短的在堆上方) 遍历堆中的元素,因为小根堆的缘故,先遍历的都是距离短的点,这样就可以保证松弛的数据越来越贴近我们的目的 重复3~5步,直到堆中没有元素为

qq_43347318的博客 448

MATLAB实现Dijkstra最短路算法

1.算法作用及适用范围 源点与汇点为图中存在边的两个顶点; 费用即为权值;(如有不便,可以在草稿纸上画出来并标明权值) 迪克斯特拉算法解决无向加权图中最短路问题,所有的权为正。 1.1推理描述 需求:求从①顶点到④顶点的最短路径 分析:(权值为到①的权值和) 寻找第一近的顶点;假设从①顶点开始(后文简称1);找到一个距离①最近的顶点,这些顶点分别为权值为4的②和权值为2的⑥;所以⑥是最靠近①的顶点。 寻找第二近的顶点;查看所有以①为起点到集合{①,⑥}中的顶点的最短路;接着的边以{①,⑥}中的边为起点,寻

weixin_45827640的博客 4072

图(邻接矩阵)的最短路径

求图的最短路径,有两个经典的算法——dijkstra和floyd算法。 dijkstra算法适合稀疏图(邻接链表)求单点到其他点的最短路径。floyd算法适合稠密图(邻接矩阵)求各点到其他点的最短路径。邻接矩阵是图的一种简单的表示形式。dijkstra算法虽然适合邻接链表,算法题中也常用邻接矩阵实现。 宏定义点个数100,使用typedef定义边权重的类型int,方便程序的调试,同时用int(...

jjccero 1万+

求单源最短路径【Dijkstra算法&&SPFA算法】(2019.6.13训练)

前言 Dijkstra算法,是正权图中求单源最短路径的经典算法,其朴素算法时间复杂度为O(n2),加入优先队列优化(堆优化)后时间复杂度可以达到O((m+n)logn)。注意Dijkstra算法不适用于负权图, 也就是说给出的边权不能有负值。正权图最好用Dijkstra算法,相较于SPFA算法比较稳定。(以上来自于洛谷大佬的总结) 为了更好地看懂Dijkstra算法(优化)的模板,需要用到链式前向...

nefu_ljw的博客 570

数据结构——第四章图:06求两点之间的最短路径

1.求两点之间的最短路径: (1)求从某个源点到其余各点的最短路径:Dijstra(迪杰斯特拉)算法; (2)求每一对顶点之间的最短路径:Floyd(弗洛伊德)算法。 2.Dijstra算法的基本思想:依据最短路径的长度递增的次序求得各条路径。其中,从源点到顶点v的最短路径是所有最短路径中长度最短者。在这条路径上,必定只含有一条弧,并且这条弧的权值最小。(1)下一条路径长度次短的最短路径只有...

weixin_30629977的博客 932

最短路径、生成最小树(Dijkstra、Floyd-Warshall、Kruskal、Prim)

目录 最短路径 Dijkstra Floyd-Warshall 最小生成树 Kruskal Prim 最短路径 Dijkstra算法,寻找单源最短路径(一个顶点到其余所有顶点的最短路径) 这里寻找一号顶点到其余所有顶点的最短路径: #include<stdio.h> #define MAX 0x3f3f3f3f//无穷 #define N 101 int main() { int e[N][N]={0},n,m,a,b,c,min,t; int

TGRD4的博客 1015

POJ:3268 Dijkstra的运用

POJ:3268 题目链接 Silver Cow Party Time Limit: 2000MS Memory Limit: 65536K Description One cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbered 1…N is going to attend the big cow party to be held at farm #X (1 ≤ X ≤ N). A total of M (1 ≤ M ≤ 100,000)

qq_45863710的博客 239

Dijkstra求最短路径和次短路径,类似求次大值

首先,有时候题目需要得到的不是最值,而是次值。 与我们求最值过程类似,我们求最值,若是最值被替换,原来的最值就变成次值,若是次值可以更新就更新。 没有增加多少难度。 例 USACO 2006 Nov Roadblocks 核心代码for (int j=last[u];j;j=e[j].next) { int v=e[j].to;

klxwl的博客 1465

算法分析与设计实验2-用dijkstra算法算两点间最短路径

1.问题 对于下图使用Dijkstra算法求由顶点a到顶点h的最短路径,按实验报告模板编写算法。 2.解析 3.设计 4.源码 [github源码地址] https://github.com/tangzhejia/algorithm ...

weixin_43891876的博客 404
上一篇: 字符串转为整数求指点
下一篇: 最长有效括号
wingahi
博客等级 码龄15年 15粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值