【算法】Dijkstra求最短路算法

TOP提示:Dijkstra算法只适用于不含负权边的情况 

Dijkstra算法是一个基于贪心,广搜和动态规划 求图中某点到其他所有点的最短路径的算法 

一、步骤

首先我们先总结Dijkstra算法的完整步骤

我们需要一个dis数组存储从起点到达其他节点的最短距离,一个check数组判断从起点到某点的最短距离是否已确定,一个path二维数组存储图中从点 i 到点 j 的距离

一共循环n次(n个节点),起初将从起点到其他所有节点的距离(dis[i])初始化为最大值。

每次循环从dis数组中未确定最短路径的所有点中找出最小值的下标mini(第一次循环时最小值为起点dis[1],因为起点到自己的距离为0,其他的都初始化为了最大值),此时该最小值即为起点到该点的最短路径,在check数组中标记该点,然后计算从该点出发到达其他节点的距离,如果比原来的值更小则更新dis数组。

二、原理

贪心是其中的重要思想,为什么每次找出的最小值就是起点到该点的最短路径呢?

这就要提到为什么Dijkstra不适用于含负权边的情况了,当边的权值全部为正时,从起点经过其他的点到达最小值点的路径长度必定会大于原来的这个最小值!

例如你从起点到A点的最短路径是100,到B点的最短路径是200,那么你从起点经过B点到达A点的距离可能会比直接从起点到A点的距离短吗?除非从B点到A点的距离为负数。 

所以当我们每次扫描未确定最短路径中的所有点,找出其中的最小值,该最小值就是起点到达该点的最短路径。经过n次循环,我们就能找出起点到达所有点的最短路径 

我们以下面这道题为例实战一下:

完整代码:

#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;const int N = 510;int n, m, dis[N];
int path[N][N];
bool check[N];int dijkstra()
{memset(dis, 0x3f, sizeof dis); //将起点到其他点的路径初始化为最大值dis[1] = 0; //起点到自己的距离为0for(int i = 1;i <= n;i++) //n次循环{int mini = -1; for(int j = 1; j <= n;j++){if(!check[j] && (mini == -1 || dis[mini] > dis[j]))//从未确定最短距离的点中取出最小值mini = j;}check[mini] = true; //标记该点为已确定for(int j = 1;j <= n;j++){//以该点为基础更新其他所有点的最短距离dis[j] = min(dis[j], dis[mini] + path[mini][j]);}}if(dis[n] == 0x3f3f3f3f) return -1; //如果n号点的距离还是为最大值,说明无法到达return dis[n];
}int main()
{//题目中说可能存在重边,所以将边的权值初始化为最大值便于比较memset(path, 0x3f, sizeof path);cin >> n >> m;for(int i = 1;i <= m;i++){int a, b ,c;cin >> a >> b >> c;path[a][b] = min(path[a][b], c); //如果重边,取最小值}int t = dijkstra(); //Dijkstra算法cout << t << endl;return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Gradio 基础使用示例

文章目录 Gradio 基础使用示例简介安装示例-简单的输入、输出示例-启动配置示例-聊天对话示例-多页面Tab切换示例-使用Block自定义布局示例-Plot绘图示例-状态管理示例-提示、进度条参考 Gradio 基础使用示例 简介 Gradio 是一个用于构建快速原型和部署机器学习应用程序的开源…

更新、简略高效的用git(Gitee篇)

前提&#xff1a;因为很多编译软件虽然可以连接git&#xff0c;但是操作起来还是比较懵&#xff0c;不同软件有不同的上传git的方式&#xff0c;而且有的连着GitHub有的是Gitee&#xff0c;那么使用Git Bash无疑是万无一失的方式 然后这一篇也仅针对上传Gitee&#xff0c;上传G…

(2024,SD,条件 GAN,蒸馏,噪声到图像翻译,E-LatentLPIPS)将扩散模型蒸馏为条件 GAN

Distilling Diffusion Models into Conditional GANs 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 3. 方法 3.1 用于一步生成的配对的噪声到图像翻译 3.2 用于潜在空间蒸馏…

【机器学习300问】83、深度学习模型在进行学习时梯度下降算法会面临哪些局部最优问题?

梯度下降算法是一种常用的优化方法&#xff0c;用于最小化损失函数以训练模型。然而&#xff0c;在使用梯度下降算法时&#xff0c;可能会面临以下局部最优问题。 &#xff08;一&#xff09;非凸函数的局部极小值 问题描述&#xff1a;在复杂的损失函数中&#xff0c;如果目…

Pandas数据取值与选择

文章目录 第1关&#xff1a;Series数据选择第2关&#xff1a;DataFrame数据选择方法 第1关&#xff1a;Series数据选择 编程要求 本关的编程任务是补全右侧上部代码编辑区内的相应代码&#xff0c;要求实现如下功能&#xff1a; 添加一行数据&#xff0c;时间戳2019-01-29值为…

深度学习课程论文精读——ESRGAN

目录 1.研究概述 2.论文创新 2.1 改进生成器的网络框架 2.2 改进判别器 2.3 改进感知损失 2.4 网络插值 3.实验 3.1 评价指标 3.2 训练细节 3.3 对比实验 3.4 消融实验 3.5 网络插值 4.总结 5.阅读参考 文章标题&#xff1a;《ESRGAN: Enhanced Super-Resolution…

Ardupilot Rpanion iperf网络性能测试

Ardupilot Rpanion iperf网络性能测试 1. 源由2. 分析3. 安装4. 测试4.1 第一次测试4.1.1 iperf测试参数A4.1.1.1 测试链路14.1.1.2 测试链路24.1.1.3 测试链路3 4.1.2 iperf测试参数B - 测试链路34.1.2.1 测试数据4.1.2.2 数据简单分析4.1.2.3 数据深入分析4.1.2.4 模拟测试网…

图像锐化——非锐化掩膜USM和锐化掩膜SM(附代码)

非锐化掩膜 (USM) 和锐化掩膜 (SM) 都是常用的图像锐化技术。它们都可以通过增强图像的边缘信息来提高图像的清晰度。 目录 一、非锐化掩膜USM1.1 USM原理1.2 USM实现步骤1.3 优点1.4 代码 二、锐化掩膜SM2.1 SM原理2.2 SM实现步骤2.3 优点2.4 代码 三、锐化效果四、总结4.1 效…

Spring框架中常见注解

Spring&#xff1a; SpringMVC&#xff1a; RequestMapping用在类上表示所有该类下方法的父路径 RequestParam 做映射&#xff0c;前端请求的参数映射到控制器Controller的处理方法上的参数上。 【当参数需要设置默认值&#xff08;前端没有发送这个参数&#xff09;、参数名…

影刀进行shopee商品排名零代码爬取

需要研究shopee平台的排名更新时间段和周期&#xff0c;几分钟用影刀写了一个爬取应用&#xff0c;每10分钟进行一次排名爬取&#xff08;以fan‘风扇’为例&#xff09;&#xff0c;0代码爬取。 打开’fan’关键词搜索网页&#xff1b;等待网页加载&#xff1b;滚动进一步加载…

Python | Leetcode Python题解之第71题简化路径

题目&#xff1a; 题解&#xff1a; class Solution:def simplifyPath(self, path: str) -> str:names path.split("/")stack list()for name in names:if name "..":if stack:stack.pop()elif name and name ! ".":stack.append(name)re…

问题:IDEA中打包插件,打出来的jar包一直是最原始的代码

问题详情&#xff1a; 我在配置maven的分离式打包时&#xff0c;打出来的jar包运行不含有我新增的代码&#xff08;一直都是旧的&#xff09; 打包配置&#xff1a; pom.xml: <!-- Maven Jar 插件配置 --><plugin><groupId>org.apache.maven.plugins</gr…