Dijkstra算法(C/C++简明注释详解版: 代码实现 测试数据)

算法思想简述(From C知道):

Dijkstra算法是一种求解最短路径的贪心算法,它能够找到两点之间的最短路径。C语言实现Dijkstra算法需要以下步骤:

1. 创建一个数组用于记录起始点到其他节点的距离,初始化为无穷大。
2. 创建一个数组用于记录节点是否已经被访问过,初始化为false。
3. 将起始点到自身的距离设为0。
4. 遍历图中所有节点,对于每个节点:
   1) 找到起始点到该节点距离最短的节点(即未被访问过且距离最小的节点)。
   2) 标记该节点已经被访问过。
   3) 遍历该节点的所有邻居节点,更新起始点到邻居节点的距离。
5. 最终得到起始点到其他所有节点的最短距离。

dijkstra函数代码实现:

int n, m, s, e; // 节点数, 有向线段数, 起点, 终点
int graph[size][size]; // 图的邻接矩阵
int dist[size]; // 起点到各点的最短距离
bool visited[size]; // 记录节点是否被访问过

void dijkstra(int s)
{
	for(int i=1; i<=n; i++) // 初始化距离和访问状态
	{
		dist[i] = max;
		visited[i] = false;
	}
	dist[s] = 0; // 起点到自身的距离为0
	for(int i=1; i<=n; i++) // 遍历所有节点
	{
		int min = max, u = -1;
		for(int j=1; j<=n; j++) // 找到未访问节点中距离起点最近的节点
		{
			if(dist[j] < min && !visited[j])
			{
				u = j; min = dist[j];//可以用i=1的情况来理解,找到离原点最近的一个节点
			}
		}
		if(u == -1) return; // 若未找到可达节点,退出循环
		visited[u] = true; // 标记节点u为已访问
		for(int v=1; v<=n; v++) // 更新起点到各节点的距离
		{
			//从原点先到u再到v的路径 < 原先记录的从原点到v的路径	//u,v之间有通路
			if(dist[v] > dist[u] + graph[u][v] && !visited[v] && graph[u][v] != max) 
			{										//v尚未访问过
				dist[v] = dist[u] + graph[u][v];
			}
		}
	}
}

整体程序代码实现

#include<bits/stdc++.h> 
using namespace std; 
#define size 1000 // 定义图的最大节点数
#define max 1000000000 // 定义最大值
int n, m, s, e; // 节点数, 有向线段数, 起点, 终点
int graph[size][size]; // 图的邻接矩阵
int dist[size]; // 起点到各点的最短距离
bool visited[size]; // 记录节点是否被访问过

void dijkstra(int s)
{
	for(int i=1; i<=n; i++) // 初始化距离和访问状态
	{
		dist[i] = max;
		visited[i] = false;
	}
	dist[s] = 0; // 起点到自身的距离为0
	for(int i=1; i<=n; i++) // 遍历所有节点
	{
		int min = max, u = -1;
		for(int j=1; j<=n; j++) // 找到未访问节点中距离起点最近的节点
		{
			if(dist[j] < min && !visited[j])
			{
				u = j; min = dist[j];//可以用i=1的情况来理解,找到离原点最近的一个节点
			}
		}
		if(u == -1) return; // 若未找到可达节点,退出循环
		visited[u] = true; // 标记节点u为已访问
		for(int v=1; v<=n; v++) // 更新起点到各节点的距离
		{
			//从原点先到u再到v的路径 < 原先记录的从原点到v的路径	//u,v之间有通路
			if(dist[v] > dist[u] + graph[u][v] && !visited[v] && graph[u][v] != max) 
			{										//v尚未访问过
				dist[v] = dist[u] + graph[u][v];
			}
		}
	}
}

int main()
{
	cout<<"依次输入节点数, 有向线段数, 起点, 终点(数字间以空分隔): ";
	cin>>n>>m>>s>>e; // 输入节点数, 有向线段数, 起点, 终点
	for(int i=1; i<=n; i++) // 初始化图的邻接矩阵
	{
		for(int j=0; j<=n; j++)
		{
			graph[i][j] = i==j ? 0: max;
		} 
	}
	int u, v, wt;
	for(int i=1; i<=m; i++) // 输入有向线段的起点、终点和权重
	{
		cin>>u>>v>>wt;
		graph[u][v] = wt;
		graph[v][u] = wt; // 无向图,对称设置权重
	}
	dijkstra(s); // 调用Dijkstra算法求最短路径
	cout<<"min_track_length: "<<dist[e]; // 输出起点到终点的最短距离
	return 0;
}

送上测试数据一份:

/*
测试数据:
5 6 1 5
1 2 4
2 5 10
1 3 5
3 2 1
3 4 2
4 5 6
*/

~~ 希望对你有帮助 ~~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Xamarin.Android项目网络串口助手怎么通过路由器跟PC网络串口连接

AndroidManifest.xml ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/1ae7cd0d03c84343a62bccfd92e45d2c.png)

Mendix创客访谈录|助力工业领域,Mendix与IIOT相融合

本期创客 汤登揆 太平洋电信股份有限公司 AI 技术支持工程师 大家好&#xff0c;我是汤登揆&#xff0c;帝国理工大学&#xff0c;生态算法专业&#xff0c;主要关注于产品结构分析和产品应用落地。 目前任职于太平洋电信股份有限公司&#xff0c;主要专注于AI大模型的应用落地…

python3.12.0 在Linux 制作镜像包 部署到docker 全过程

项目结构&#xff1a; 比如&#xff0c;在pycharm里需要运行 themain.py 1、上传Linux的目录结构&#xff1a; Dockerfile 文件需要制作&#xff1a; 这里是关键&#xff1a; #基于的基础镜像 FROM python:3.12.0 #代码添加到code文件夹 ADD ./EF_NFCS /code #设置code文…

工厂的隐性成本有哪些?如何应对?

隐性成本是指企业在生产过程中不易被察觉或量化的成本&#xff0c;它们往往隐藏在企业的日常运营中&#xff0c;但同样会对企业的总成本产生影响。 工厂的隐性成本有哪些&#xff1f; 工厂的隐性成本主要包括以下几个方面&#xff1a; 1、停滞资源成本&#xff1a;如闲置的机…

effective python学习笔记_推导与生成

用推导取代map和filter 序列推导可取代map和filter&#xff0c;优越性有&#xff1a;1可读性强2不需要map的函数 控制推导逻辑的子表达式不要超过2个 即推导的for层数最多建议两层&#xff0c;多了可读性会下降&#xff0c;反而用for循环会清晰 一层for内可连接多个if&…

LifeCycle之ProcessLifeCycleOwner

问题&#xff1a;想要知道应用程序当前处在前台、后台、或从后台回到前台&#xff0c;想要知道应用的状态&#xff0c; LifeCycle提供了ProcessLifeCycleOwner的类&#xff0c;方便我们知道整个应用程序的生命周期情况 ProcessLifeCycleOwner 使用方法 1.首先添加依赖 imple…

初学者理解Transformer,本文is all you need

要问现在AI领域哪个概念最热&#xff0c;必然是openAI推出chatGPT之后引发的大模型。然而这项技术的起源&#xff0c;都来自一篇google公司员工的神作“Attention Is All You Need”——本文标题也是一种致敬^_^&#xff0c;目前已有近12万的引用(还在增长)。 在“Attention Is…

【qt】容器的用法

容器目录 一.QVertor1.应用场景2.增加数据3.删除数据4.修改数据5.查询数据6.是否包含7.数据个数8.交换数据9.移动数据10.嵌套使用 二.QList1.应用场景2.QStringList 三.QLinkedList1.应用场景2.特殊点3.用迭代器来变量 四.QStack1.应用场景2.基本用法 五.QQueue1.应用场景2.基本…

【设计模式】JAVA Design Patterns——Abstract-document

&#x1f50d; 目的 使用动态属性&#xff0c;并在保持类型安全的同时实现非类型化语言的灵活性。 &#x1f50d; 解释 抽象文档模式使您能够处理其他非静态属性。 此模式使用特征的概念来实现类型安全&#xff0c;并将不同类的属性分离为一组接口 真实世界例子 考虑由多个部…

【Linux】在Linux中执行命令ifconfig, 报错-bash:ifconfig: command not found解决方案

一、报错信息 ifconfig 报错-bash:ifconfig: command not found 同时&#xff0c;通过ip addr查看&#xff0c;也看不到IP信息 二、解决方案 找到ifcfg-ens0文件&#xff0c;此文件的目录在/etc/sysconfig/network-scripts目录下 命令&#xff1a;cd /etc/sysconfig/network…

89C52单片机+ESP8266做的物联网+反馈 e4a手机客户端源程序

资料下载地址&#xff1a;89C52单片机ESP8266做的物联网反馈 e4a手机客户端源程序 MCU是89C52单片机 WiFi模块是ESP8266 其他 8路继电器 电源模块 使用贝壳物联做服务器 还有客户端。 也可以用花生壳做内网穿透&#xff0c;8266做服务器&#xff0c;也可以实现物联以及反馈&a…

vue多选功能

废话不多说&#xff0c;直接上代码&#xff01;&#xff01;&#xff01; <template><div class"duo-xuan-page"><liv-for"(item, index) in list":key"index"click"toggleSelection(item)":class"{ active: sel…

[前后端基础]图片详解

[前后端基础]图片传输与异步-CSDN博客 https://juejin.cn/post/6844903782959022093#heading-3 base64、file和blob用JS进行互转的方法大全【前端】_js base64转blob-CSDN博客 后端存储方式 对于第一种存储方式&#xff0c;我们前端直接将存储路径赋值给 src 属性即可轻松显示。…

react项目中封装一个通用的边界Boundary

# Boundary 通用的边界,同时是一个Suspense 和一个 ErrorBoundary 正常情况不直接用,使用一下几个封装好的: -Boundary.FullSizeLoading: 占满父容器全部高度,居中显示等待动画; -Boundary.Loading: 占满一行,显示一个普通尺寸的等待动画; -Boundary.Blank: 什么都不显示…

Hadoop3:HDFS的Shell操作(常用命令汇总)

一、简介 什么是HDFS的Shell操作&#xff1f; 很简单&#xff0c;就是在Linux的终端&#xff0c;通过命令来操作HDFS。 如果&#xff0c;你们学习过git、docker、k8s&#xff0c;应该会发现&#xff0c;这些命令的特点和shell命令非常相似 二、常用命令 1、准备工作相关命令…

let命令

let 命令 let 与 var 二者区别&#xff1a; 作用域不同&#xff1a;变量提升&#xff08;Hoisting&#xff09;&#xff1a;临时性死区重复声明&#xff1a; 联系&#xff1a;举例说明&#xff1a; 块级作用域 块级作用域的关键字使用 var&#xff08;无块级作用域&#xff09;…

x64dbg中类似于*.exe+地址偏移

在CE和xdb中&#xff0c;形如*.exe数字偏移形式的地址被称为模块地址&#xff0c;CE附加到进程后点击查看内存&#xff0c;显示如下图 这种地址学名叫做模块地址&#xff0c;在x64dbg中显示如下图&#xff1a; CE中可以关闭&#xff0c;从而显示绝对的虚拟地址&#xff0c;如下…

Hive-URL解析函数

Hive-URL解析函数 1.实际工作需求 2.URL的基本组成 3.Hive中的Url解析函数 parse_url函数 parse_url_tuple函数

VScode通过ssh远程连接服务器被拒绝:permission denied, please try again

使用场景&#xff1a; 使用windows系统下的vscode远程连接服务器的linux系统&#xff0c;终端提示permission denied, please try again,但是使用cmd是可以远程登录的。 解决办法&#xff1a; 前提条件windows端的vscode安装了ssh远程连接的相关插件Remote - SSH&#xff0c;…

红米Turbo3小米平板6SPro澎湃OS系统强解BL锁-跳小米社区绑定-刷ROOT权限

红米Turbo3小米平板6SPro这2款设备都出厂为澎湃OS系统&#xff0c;官方提供都是小米社区申请解锁权限&#xff0c;然后自己答题解锁&#xff0c;门槛非常高&#xff0c;想要玩机root的用户&#xff0c;都在堵在门外。还在这目前这两款机型官方并没有加入强制验证&#xff0c;在…
最新文章