Dijkstra迪杰斯特拉算法求最短路径(C++实现)

news2024/12/23 9:28:36

名人说:一花独放不是春,百花齐放花满园。——《增广贤文》
作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊)

目录

      • 〇、Dijkstra迪杰斯特拉算法介绍
        • 1、Dijkstra算法是什么?
        • 2、Dijkstra算法的由来
        • 3、Dijkstra算法的基本思想
      • 一、代码及注释
      • 二、思路阐明
      • 三、样例测试

以下代码个人分享出来,仅供学习交流,且仅在CSDN平台发布,未经授权禁止二次转发。

〇、Dijkstra迪杰斯特拉算法介绍

1、Dijkstra算法是什么?

Dijkstra算法是一个基于「贪心」、「广度优先搜索」、「动态规划」求一个图中一个点到其他所有点的最短路径的算法,常规迪杰斯特拉算法的时间复杂度 O (n^2) 。

2、Dijkstra算法的由来

它是由荷兰计算机科学家艾茲赫尔·戴克斯特拉在1956年发现的,并于3年后在期刊上发表。

在这里插入图片描述
他的一些学术贡献包括(但不仅限于):

  • 提出了目前在离散数学中应用广泛的最短路径算法(Dijkstra’s Shortest Path First Algorithm)
  • 为解决操作系统中资源分配问题,提出银行家算法

又是膜拜大佬的一天

3、Dijkstra算法的基本思想

  • 首先,将所有的顶点分为两个集合:已经求出最短路径的顶点集合(用S表示)和未求出最短路径的顶点集合(用Q表示)。
  • 初始时,S只包含源点,Q包含除源点外的其他顶点,源点到自身的距离为0,源点到其他顶点的距离为无穷大(或者是邻接矩阵中对应的权值)。
  • 然后,每次从Q中选择一个距离最小的顶点u,将其加入到S中,并用u更新Q中的其他顶点的距离,即如果存在一条从u到v的边,且dist[u]+w(u,v)<dist[v],则更新dist[v]=dist[u]+w(u,v)。
  • 重复上述过程,直到Q为空或者目标顶点被加入到S中。
  • 最后,输出源点到其他顶点的最短距离和最短路径。

Dijkstra算法可以用不同的数据结构来实现,例如数组、堆、优先队列等。不同的数据结构会影响算法的时间复杂度和空间复杂度。一般来说,使用邻接表和优先队列可以达到较好的效率。本文以优先队列为例。

一、代码及注释

//创作者:Code_流苏(CSDN)
#include<iostream>
#include<vector>
#include<queue>
#include<string>
#define MAXV 100
#define INF 32767 
using namespace std;
typedef struct
{
	int no;
	string name;
}VertexType;
typedef struct
{
	int v;//边的终止顶点 
	int w;//边的权值 
}Edge;
typedef struct//图的结构体 
{
	VertexType vex[MAXV];//顶点表 
	vector<Edge> arcs[MAXV];//邻接表 
	int vexnum,arcnum;//顶点数目和边的数目
}AMGraph;

void CreateGraph(AMGraph *G)//创建图 
{
	int i;
	int u,v,w;
	cout<<"请输入顶点数和边数: ";
	cin>>G->vexnum>>G->arcnum;
	cout<<"依次输入顶点名字: ";
	for(i=0;i<G->vexnum;i++)
	{
		cin>>G->vex[i].name;
		getchar();
	}
	cout<<"下标从0开始\n";
	for(i=0;i<G->arcnum;i++)
	{
		G->vex[i].no=i;
		cout<<"请输入第"<<i+1<<"条边<vi,vj>两个顶点和权值: ";
		cin>>u>>v>>w;
		G->arcs[u].push_back({v,w}); //添加边到邻接表
		G->arcs[v].push_back({u,w}); //无向图需要添加两次
	}
} 

void Dispath(AMGraph G,int dist[],int path[],int s[],int v)//输出 
{
	int i,j,k;
	int apath[MAXV],d;//存放一条最短路径及其顶点个数 
	for(i=0;i<G.arcnum;i++)//从顶点v到顶点i的路径
	if(s[i]==1&&i!=v)
	{
		cout<<"从顶点"<<G.vex[v].name<<"到"<<G.vex[i].name<<"的路径长度为:"<<dist[i]<<"\t路径为:";
		d=0;apath[d]=i;//添加路径上的终点
		k=path[i];
		if(k==-1)
		cout<<"无路径\n";
		else
		{
			while(k!=v)
			{
				d++;apath[d]=k;
				k=path[k];
			}
			d++;apath[d]=v;//添加路径上的起点 
			cout<<G.vex[apath[d]].name;//输出起点 
			for(j=d-1;j>=0;j--)//输出其他顶点 
			cout<<","<<G.vex[apath[j]].name;
			cout<<"\n";
		} 
		
	} 
	
}

void Dijkstra(AMGraph G,int v)//迪杰斯特拉算法 
{
	int dist[MAXV],path[MAXV];//path[]记录到达终点前的最后一个顶点
	int s[MAXV];//0表示未加入最短路径顶点集,1已加入
	priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> q; //优先队列,按照距离从小到大排序
	int i,u;
	for(i=0;i<G.vexnum;i++)//dist和path数组初始化 
	{
		dist[i]=INF;//距离初始化为无穷大
		s[i]=0;//s[]置空 
		path[i]=-1;//路径初始化为-1
	} 
	dist[v]=0;//源点到自身的距离为0
	q.push({0,v});//源点入队
	while(!q.empty())//队列不为空时循环
   { 
    	u=q.top().second;//取出队首的顶点
    	q.pop();//出队
    	if(s[u]==1) continue;//如果已经加入最短路径顶点集,跳过
    	s[u]=1;//否则,将其加入最短路径顶点集
    	for(auto e:G.arcs[u])//遍历u的邻接边
     	if(s[e.v]==0)//如果终点不在s中
	  	if(dist[u]+e.w<dist[e.v])//如果可以更新距离
        {
			dist[e.v]=dist[u]+e.w;//更新距离
	    	path[e.v]=u;//更新路径
	    	q.push({dist[e.v],e.v});//将终点入队
	    }
   }
  	Dispath(G,dist,path,s,v);//输出 
}

int main()
{
	AMGraph G;
	CreateGraph(&G);
	Dijkstra(G,0);
	return 0;	
}

二、思路阐明

① 首先,创建一个图的结构体,用顶点表和邻接表来存储图的信息,顶点表中存储顶点的编号和名字,邻接表中存储每个顶点的邻接边和权值。

② 然后,输入顶点数和边数,以及每个顶点的名字和每条边的起点、终点和权值,将它们添加到图的结构体中。

③ 接着,定义一个dist数组,用来存储源点到其他顶点的最短距离,初始化为无穷大;定义一个path数组,用来存储到达终点前的最后一个顶点,初始化为-1;定义一个s数组,用来标记是否加入最短路径顶点集,初始化为0;定义一个优先队列,用来存储未加入最短路径顶点集的顶点,并按照距离从小到大排序。

④ 然后,将源点到自身的距离设为0,并将源点入队。

⑤ 接着,循环直到队列为空,每次取出队首的顶点u,并将其加入最短路径顶点集。然后遍历u的邻接边,如果终点v不在最短路径顶点集中,并且dist[u]+w<dist[v],则更新dist[v]为dist[u]+w,并更新path[v]为u,并将v入队。

⑥ 最后,输出源点到其他顶点的最短路径长度和路径。

三、样例测试

0- 4,依次代表A、B、C、D、E
在这里插入图片描述

请输入顶点数和边数: 5 7
依次输入顶点名字: A B C D E
下标从0开始
请输入第1条边<vi,vj>两个顶点和权值: 0 1 10
请输入第2条边<vi,vj>两个顶点和权值: 0 3 30
请输入第3条边<vi,vj>两个顶点和权值: 0 4 100
请输入第4条边<vi,vj>两个顶点和权值: 1 2 50
请输入第5条边<vi,vj>两个顶点和权值: 2 4 10
请输入第6条边<vi,vj>两个顶点和权值: 3 2 20
请输入第7条边<vi,vj>两个顶点和权值: 3 4 60
从顶点A到B的路径长度为:10      路径为:A,B
从顶点A到C的路径长度为:50      路径为:A,D,C
从顶点A到D的路径长度为:30      路径为:A,D
从顶点A到E的路径长度为:60      路径为:A,D,C,E

--------------------------------
Process exited after 38.41 seconds with return value 0
请按任意键继续. . .

Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊)
如果对大家有帮助的话,希望大家能多多点赞+关注!这样我动力会更足哦! ღ( ´・ᴗ・` )比心

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/644988.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

低代码工具:jvs-list(列表引擎)2.1.7功能清单及新增功能介绍

在低代码开发平台中&#xff0c;列表页是一个用于显示数据列表的页面。它通常用于展示数据库中的多条记录&#xff0c;并提供搜索、排序和筛选等功能&#xff0c;以方便用户对数据进行查找和浏览。 jvs-list是jvs快速开发平台的列表页的配置引擎&#xff0c;它和普通的crud 具…

Rocky Linux9.的系统中安装MySQL8 实战

前言 Centos7 已经停止维护&#xff0c;学习其他linux系统势在必行&#xff0c;今天我们要探讨的是&#xff1a; 在Rocky linux9的系统上安装MySQL8 文章目录 前言1. 从Appstream中进行安装1.1 更新系统中的所有软件包1.2 安装MySQL1.3 启动并测试1.4 查看MySQL版本 2. 初始化操…

获取地理位置请求免费天气接口

需求&#xff1a;根据地理位置信息去请求免费的天气接口数据&#xff0c;拿到数据后进行展示&#xff0c;这边我用到了俩个key&#xff0c;一个是高德天气的key和心知天气的key&#xff0c;为什么要这么麻烦呢&#xff0c;是因为之前写过一版不需要获取地理位置&#xff0c;直接…

嵌入式系统开发中的常见挑战和困难

当涉及嵌入式系统开发时&#xff0c;可能会遇到以下一些常见的挑战和困难&#xff1a; 复杂的硬件和软件集成&#xff1a;嵌入式系统通常涉及硬件和软件的紧密集成&#xff0c;需要同时理解和处理硬件和软件层面的问题。这种复杂性可能导致调试和故障排除变得更加困难。 有限…

【哈佛积极心理学笔记】第19讲 让爱情天长地久

第19讲 让爱情天长地久 What makes relationship thrive, some characteristic: work hard the fix mindset: “you are so smart, you are so intelligent” the malleable mindset: “you work so hard” Finding mindset: “finding the right partner” (fix) some thin…

PLC领域从业者的工作待遇现状如何?

目前从事可编程逻辑控制器&#xff08;PLC&#xff09;领域的人员在工作待遇方面相对较好。PLC是工业自动化中广泛使用的控制设备&#xff0c;用于监控和控制各种工业过程和机械设备。以下是关于从事PLC的人员工作待遇的一些常见情况和趋势&#xff1a; 薪资水平&#xff1a;P…

【算法与数据结构】242、LeetCode有效的字母异位词

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;题目要求判断两个字符串是否为字母异位词。什么是字母异位词呢&#xff1f;顾名思义&#xff0c;就是字…

深入理解相机硬件抽象层

和你一起终身学习&#xff0c;这里是程序员Android 经典好文推荐&#xff0c;通过阅读本文&#xff0c;您将收获以下知识点: 一、概览二、Camera HIDL 接口三 、Camera Provider 主程序四、Camera HAL3 接口 一、概览 始于谷歌的Treble开源项目&#xff0c;基于接口与实现的分离…

【AUTOSAR】UDS协议的代码分析与解读(二)----ECU诊断协议概述

UDSO诊断服务技术规范 1 范围 本规范规定了增强型诊断需求的诊断服务部分的内容&#xff0c;定义了通用电子系统需遵循的UDS通用执行 规则。 本规范适用于集团x事业部所有平台车型&#xff0c;所有电子控 制单元(ECU) 的诊断需求&#xff0c;均需按此规范执行。 本规范定义的…

Python神经网络编程学习笔记

文章目录 神经网络基本原理线性分类器学习率一个线性分类器的局限性逻辑AND、逻辑OR逻辑XOR 神经元sigmoid function的logistic function(逻辑函数) 多层神经元演示只有两层&#xff0c;每层两个神经元的神经网络的工作矩阵大法(点乘)使用矩阵乘法的三层神经网络示例反向传播误…

AJAX概述

1.1什么是AJAX. Ajax即AsynchronousJavascript And XML&#xff1a;异步数据回调。 使用Ajax技术网页应用能够快速地将更新呈现在用户界面上&#xff0c;不需要重载&#xff08;刷新&#xff09;整个页面【只刷新局部】&#xff0c;这使得程序能够更快地回应用户的操作。、 1…

H5U PLC EtherCAT总线伺服回原(6098H=3)

回原方式35请参看下面文章 汇川H5U PLC通过 EtherCAT总线控制伺服回原_RXXW_Dor的博客-CSDN博客大部分运动控制都会对机械回原点进行大篇幅讲解,也可以看出机械回原点的重要性。常规的回原点方式大概有几十种吧,本文会给出常用回原点的注意事项,和编程推荐写法。如果原点回…

二层和三层交换机到底有啥区别?二者如何切换?

概要 计算机网络中的交换机是用于在局域网&#xff08;LAN&#xff09;中转发数据包的重要设备。其中&#xff0c;二层交换机和三层交换机是两种常见的交换机类型。本文将详细介绍二层交换机和三层交换机的特点、工作原理、各自的优缺点以及在思科、华为、瞻博网络三家厂商如何…

互联网架构师联合总结的 Java 面试攻略,GitHub 标星 30K!

2023 年的互联网行业竞争越来越严峻&#xff0c;面试也是越来越难&#xff0c;一直以来我都想整理一套完美的面试宝典&#xff0c;奈何难抽出时间&#xff0c;这套 1000道的 Java 面试手册是行业内各大神联合总结出来的&#xff0c;上传到 Git 上目前 star 数达到了 30K 这套互…

金九银十Java面试八股文汇总(2023最新整理)

前言 这才刚刚进入 6 月&#xff0c;我就看到了许多朋友在焦急的准备“金九银十”跳槽面试&#xff0c;甚至很多即将毕业的大学生都在备战秋招&#xff0c;对于学历还算优秀的大学生来说&#xff0c;这是一次离大厂最近的机会&#xff0c;毕竟是应届毕业生&#xff0c;不会对技…

LatticeXP2深力科 LFXP2-8E-6TN144I 灵活的flexiFLASH架构 应用笔记介绍

LatticeXP2深力科 LFXP2-8E-6TN144I 是一款瞬时上电、安全、小尺寸的FPGA&#xff0c;具有多功能的开发平台,采用flexiFLASH™架构&#xff0c;结合了一个基于FPGA基本结构的 4输入查找表&#xff08;LUT&#xff09;以及用于设计数据片上存储的闪存非易失性单元。flexiFLASH架…

Triton教程 -- 利用Triton部署你自己的模型

Triton教程—利用Triton部署你自己的模型 给定一个经过训练的模型&#xff0c;我如何使用 Triton 推理服务器以最佳配置大规模部署它&#xff1f; 本文档旨在帮助回答这个问题。 对于那些喜欢高级概述的人&#xff0c;下面是大多数用例的通用流程。 对于那些希望直接进入的人…

ceph分布式存储实战

ceph分布式存储实战 分布式存储系统简介 性能与优势对比 虚拟机安装ceph集群 ceph存储系统简介 分布式存储概述 ceph基础 高可用ceph分布式存储系统部署 部署ceph集群 节点管理 ceph使用基础及数据存储案例 PG状态、数据读写流程及存储池操作 mon服务器的高可用: # apt in…

天线设计中的磁介质材料 探索可重构潜力

​from&#xff1a;IEEE Antennas & Propagation Magazine (Vol. 61 / No. 1 / Feb. 2019, pp:29-40) -- 文 前 -- 这篇文章针对铁氧体在外置磁场下磁导率发生变化这个特点&#xff0c;探讨铁氧体在可重构天线中的应用。文中对铁氧体材料的选择&#xff0c;磁导率数学模型…

C++ Builder XE AdvStringGrid的表格画线显示隐藏经典实例

源码实例下载&#xff1a;https://download.csdn.net/download/lzksword/87904787 //--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" //----------------------------…