第十六章 Dijkstra算法的讲解以及证明(与众不同的通俗证明)

news2024/10/7 12:29:27

第十六章 Dijsktra算法的讲解以及粗略证明

  • 一、Dijkstra的用途
  • 二、Dijkstra的思想及证明
    • (1)相关结论及证明:
      • 结论1:必须借助中间点时
        • 某个点到终点的最短路程=该点到中间点的最短距离+中间点到终点的最短距离
      • 结论2:存在不借助中间点的情况
        • 若该点C是A点邻接点中距离A点最近的点,则从该点A直接到C的路线就是各种其他路线中最近的。
    • (2)算法整体思路:
      • a、理解方式1:结论1+结论2+枚举
    • (3)算法的本质思想:
  • 三、Dijkstra的实现
    • 1、问题:
    • 2、代码模板:
    • 3、代码分析:
    • 4、问题解决:
      • (1)为什么用邻接矩阵
  • 四、复杂度分析:

一、Dijkstra的用途

Dijkstra算法是用来解决边权不是一,并且时,单源最短路问题的。好的,大概率这句话没有看懂。没关系的,接下来将通俗地说明一下。

边权是指边的长度,也就两个点之间的距离。单源指的是从同一个起点出发,前往不同的点。

例如下图所示:
在这里插入图片描述
那么从起点到某个点的最短路径问题,就是我们的dijkstra算法需要解决的问题。

二、Dijkstra的思想及证明

(1)相关结论及证明:

结论1:必须借助中间点时

某个点到终点的最短路程=该点到中间点的最短距离+中间点到终点的最短距离

在这里插入图片描述

结论2:存在不借助中间点的情况

若该点C是A点邻接点中距离A点最近的点,则从该点A直接到C的路线就是各种其他路线中最近的。

在这里插入图片描述

以上就是dijkstra算法的两个核心结论,接着作者将使用这两个结论还原dijkstra算法!

(2)算法整体思路:

a、理解方式1:结论1+结论2+枚举

我们看下面的图:
在这里插入图片描述

下表存储的是没有计算出最短路的点到A的距离

我们从A点出发,发现A点经过的邻接点是C和B,那么我们记录一下C和B到A的距离。
在这里插入图片描述
下表存储的是已经计算出最短路的点到A的距离

在这里插入图片描述

我们发现,通过图中的表来看距离A的最短邻接点是C,所以根据我们的结论2,A到C的最短距离就是1。因此,我们就可以把C拿出这个表了。
在这里插入图片描述

那么我们找到了AC的最短路后,我们可以尝试一下能否用一用结论1,我们看看能否找到C的最近邻接点

那么怎么办呢?我们找一下C的邻接点:B、D、E,那么此时AB的距离就是AC+BC,以此类推。
(起点到终点和终点到起点的最短路是一致的,这里反过来想更容易理解。以下将倒过来讲解)
在这里插入图片描述
因为上述红色数字是利用:XC+AC所以上述表中的大小关系,就是某个X到C的距离的大小关系。因此,CD是最短的。根据结论1:AX的最短路=XC的最短路+AC的最短路,AD最短的距离就是2,因此我们拿出D点,放入红表中。(这里判断XC的最短路,同样用到了结论2)
在这里插入图片描述

除了挑出最短路D之外,我们发现,以C为中转站的方式去走,各个点到A的距离都变小了。所以更新一下上表。
在这里插入图片描述

当我们知道了D点的最短路后,我们能不能再用结论1,尝试着再去更新一下最短路呢?

好,那我们再看一下以D为中转站,去找一下其邻接点到A的距离。
在这里插入图片描述
惊喜的是,我们的E点通过当前路线,的确小于了之前,但是另外两个点都比之前远了,其中一个原因就是B和F与D不连通。

那么我们来分析一下上下的两行数字:
在这里插入图片描述

第一行的走法是:X—>C—>A。但是XC不是最短的,因为最短的DC所在的D点已经选出去了。也就是说第一行都不满足我们的结论1。
因此,我们无法保证上面的是最短路。

第二行的走法是:X–>(D–>C–>A),根据结论1:这种走法是在**必须经过4个节点的情况下,最短的距离。**我们肯定能保证(D–>C–>A)小于X—>C—>A。但是,我们再给前面加上一个X–>D的距离呢?答案肯定是不一定的。

因此,在这种情况下,我们只能通过对比的方式去对比表中的情况。

从而得到了以下的结果。
在这里插入图片描述

为什么黑框中最小的就是确定的最短路呢?。这是不是类似于我们的结论2的思路?

我们仔细观察会发现,列表中是所有能到A的点,而表中的数字是,不通过其他黑色的点,通过一系列已知的中间点,或者直接抵达的方式所得到的距离。

如果这个距离不是最短的,那么他必须经过表中的其他点再到A点。由于再到A点的过程的距离已经大于了我们直接到的距离,所以再加上一个该点到表中某点的距离更是大于了直接抵达的距离。

因此,表格中最小的那个数,就是那个点到A点的最短路!!

而上述的思路,就是我们证明结论2的思路。

所以我们可以将表格中的点看作A的邻接点!!然后选最小的,利用结论2

此时我们将B拿出来:
在这里插入图片描述
此时,我们再看看通过某个点X到B再到A的距离是否会小于表中的数据,然后选出最小的,再放在红表中。然后再重复这个过程。

所以该算法的所有步骤如下:

不断地找邻接点,以最近的邻接点为中间点,去继续寻找新的路线,然后更新黑表,选出黑表中最小的放到红表中,最后这个红表就是所有点的最短路。

(3)算法的本质思想:

Dijkstra算法本质是一种贪心策略,即我每次都优先选择对于当前的情况最好的选择。
比如我们每次都尝试着在找到最短路的基础上,去找其他的路。即每次都做对当下最好的选择。

三、Dijkstra的实现

1、问题:

在这里插入图片描述

2、代码模板:

#include<iostream>
#include<cstring>
using namespace std;
const int N=510;
int g[N][N],dis[N];
bool s[N];
int n,m,a,b,c;
int dijkstra()
{
    memset(dis,0x3f,sizeof dis);
    dis[1]=0;
    for(int i=1;i<=n;i++)
    { 
        int t=-1;
        //结论2:
        for(int j=1;j<=n;j++)
        {
            if(!s[j]&&(t==-1||dis[j]<dis[t]))t=j;
        }
        s[t]=true;
        
        //结论1:
        for(int j=1;j<=n;j++)
        {
            dis[j]=min(dis[j],g[t][j]+dis[t]);
        }
    }
    if(dis[n]==0x3f3f3f3f)return -1;
    else return dis[n];
}
int main()
{
    memset(g,0x3f,sizeof g);
    scanf("%d%d",&n,&m);
    while(m--)
    {
        scanf("%d%d%d",&a,&b,&c);
        g[a][b]=min(g[a][b],c);
    }
    cout<<dijkstra();
}

3、代码分析:

在这里插入图片描述

4、问题解决:

(1)为什么用邻接矩阵

邻接矩阵是一个二维数组,他记录了所有可能存在的边,当边数较少的时候,它会存储很多没用的点。但是现在我们发现边的数量是10的5次方。所以基本上每两个点之间都有边,所以用邻接矩阵几乎不会浪费空间。

四、复杂度分析:

在这里插入图片描述
外循环n次,内循环2*n次,所以时间复杂度是O(N2)

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

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

相关文章

数据分析思维(一)|信度与效度思维

信度与效度思维 1、概念 信度与效度思维通常用于在数据分析中进行更有价值的指标选择。 信度&#xff1a;指标的可靠程度。包括一致性及稳定性。&#xff08;口径是否一致&#xff0c;是否具有波动性&#xff09; 效度&#xff1a;指标的有效性。一个数据或指标的生成&…

JavaFX项目打包成可安装exe文件

开发环境&#xff1a;Windows 10 2H JDK&#xff1a;jdk1.8.0_112 IDEA&#xff1a;2020.3 1. 项目中导入插件依赖 <plugin><groupId>io.github.fvarrui</groupId><artifactId>javapackager</artifactId><version>1.6.6</version>&…

[附源码]计算机毕业设计JAVA婴幼儿玩具共享租售平台

[附源码]计算机毕业设计JAVA婴幼儿玩具共享租售平台 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM …

Java学习之多态一

目录 一、入门案例 Food类 Animal类 Master类 运行测试 分析 运行结果 问题总结 二、方法的多态 三、对象的多态&#xff08;重难点/核心&#xff09; 四个非常重要的知识点&#xff08;背诵&#xff09; 举例说明 父类-Animal类 子类-Dog类 子类-Cat类 运行-Po…

如何将数据库从 CloudKit 迁移到 Firebase

为什么要迁移 如果该服务仅支持 Apple 设备,则使用 CloudKit 和 CoreData 可能是最佳选择。但是,如果您还需要支持 Web 和 Android,情况就不同了。 当同时支持Web和Android时,可以使用CloudKit JS访问iCloud DB。但是实施起来比较困难,需要有苹果账号。 如果未来有同时支…

【滤波跟踪】基于北方苍鹰和粒子群算法优化粒子滤波器实现目标滤波跟踪附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

[nacos]nacos2.x+nginx集群搭建以及过程中遇到的坑

参考文档 nacos官方集群部署说明centos7安装并配置jdknacos2.x集群实现centos7安装mysql8使用nginx反代nacos报错 badrequest 400 环境准备 vmware虚拟机上跑的centos7 (原本内存2g 坑点之一!2g内存无法启动三台nacos集群,官方说明需要4g)centos7安装并配置jdk8 安装教程参考 …

Mongoose【node.js的优雅mongodb对象建模】

Mongoose基础运行流程&#xff1a; 文章目录Mongoose基础运行流程&#xff1a;官方 Docs 地址1. 安装&#xff1a;2. 使用&#xff1a;2.1 目录结构&#xff1a;2.2 初始化连接实例 [ 创建 DBHelper.js ]2.2.1 链接地址书写格式[ mongoose.connect&#xff08;参数格式 &#x…

java计算机毕业设计ssm网络相册设计sepo8(附源码、数据库)

java计算机毕业设计ssm网络相册设计sepo8&#xff08;附源码、数据库&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。…

机器学习笔记之受限玻尔兹曼机(四)推断任务——边缘概率

机器学习笔记之受限玻尔兹曼机——推断任务[边缘概率]引言回顾&#xff1a;场景构建推断任务——边缘概率求解边缘概率与Softplus函数引言 上一节介绍了受限玻尔兹曼机中随机变量节点的后验概率&#xff0c;本节将介绍随机变量结点的边缘概率。 回顾&#xff1a;场景构建 已…

木聚糖-氨基|Xylan-NH2|木聚糖-聚乙二醇-氨基|氨基-PEG-木聚糖

木聚糖-氨基|Xylan-NH2|木聚糖-聚乙二醇-氨基|氨基-PEG-木聚糖 Xylan-NH2 木聚糖-氨基 中文名称&#xff1a;木聚糖-氨基 英文名称&#xff1a;Xylan-NH2 别称&#xff1a;氨基修饰木聚糖&#xff0c;氨基-木聚糖 PEG分子量可选&#xff1a;350、550、750、1k、2k、34k、5…

统计学-双变量相关分析-相关系数、相关比、克莱姆相关系数

双变量相关分析根据变量的数据类型不同而不同。当数值数据和数值数据计算相关性时&#xff0c;指标为相关系数&#xff1b;数值数据和类别数据计算相关性时&#xff0c;指标为相关比&#xff1b;类别数据和类别数据计算相关性时&#xff0c;指标为克里姆相关系数。 1 计算公式…

基于现代深度学习的目标检测方法综述

论文地址&#xff1a;A Survey of Modern Deep Learning based Object Detection Models 论文结构&#xff1a; 一、论文亮点&#xff08;与其他综述不同&#xff09;&#xff1a; 1、深度分析了两类检测方法&#xff1a;单步和两步检测&#xff0c;并从历史的角度分析&…

【covid 时间序列】基于matlab GUI冠状病毒病例、死亡、疫苗接种仿真【含Matlab源码 2262期】

一、⛄SEIR模型简介 1 SEIR模型简介 如果所研究的传染病有一定的潜伏期&#xff0c;与病人接触过的健康人并不马上患病&#xff0c;而是成为病原体的携带者&#xff0c;归入 E 类。此时有&#xff1a; 仍有守恒关系 S(t) E(t) I(t) R(t) 常数&#xff0c;病死者可归入 R…

Vue3 快速入门及巩固基础

1. Vue 框架介绍 2. Vue3 安装方式 3. Vue3 模板语法 4. 组件的 data 属性 5. 计算属性和方法 6. 侦听器的使用 7. class 类名绑定对象 8. class 类名绑定数组 9. style 样式绑定对象 10. style 样式绑定数组 11. 条件渲染 v-if 和 v-show 12. 列表渲染 v-for 13. …

1,2-二苯基-1,2-二(4-苄溴基苯基)乙烯;TPE-MB结构式

中文名称:1,2-二苯基-1,2-二(4-苄溴基苯基)乙烯 中文同义词:1,2-双(4-(溴甲基)苯基)-1,2-二苯乙烯; 分子式:C28H22Br2 分子量:518.28 CAS&#xff1a;1053241-67-0 1,2-二苯基-1,2-二(4-苄溴基苯基)乙烯化学性质 沸点 &#xff1a;533.545.0 C(Predicted) 密度 &#xff…

医依通小程序项目总结

一、项目介绍&#xff1a; 这是一个医疗类的小程序&#xff0c;主要用于新冠疫苗预约&#xff0c;HPV疫苗预约&#xff0c;核酸预约&#xff0c;和咨询等&#xff0c;主要作用就是方便快捷&#xff0c;可以在手机上进行预约挂号&#xff0c;和一些健康自测的功能&#xff0c;还…

MySQL的零拷贝技术

1.需要了解Buffer 与 cache 的区别 Bbuffer 与 Cache 非常类似&#xff0c;因为它们都用于存储数据数据&#xff0c;被应用层读取字节数据。在很多场合它们有着相同的概念: 首先从翻译上&#xff0c;Buffer应该翻译为“缓冲”&#xff0c;Cache应该翻译为“缓存”&#xff0c…

高企技术企业对企业的作用

高新技术企业认定的作用 1、促进企业科技转型 创新是企业发展的根本动力&#xff0c;高新技术企业认定政策是一项引导政策&#xff0c;目的是引导企业调整产业结构&#xff0c;走自主创新、持续创新的发展道路&#xff0c;激发企业自主创新的热情&#xff0c;提高科技创新能力…

堆排序(大根堆与小根堆)

&#xff08;1&#xff09;是什么&#xff1f; 是一种适用于关键字较多的情况下的排序算法&#xff0c;例如在十亿个数中选出前1000个最大值或者最小值 如果在传统的排序算法中&#xff08;例如冒泡&#xff0c;插入等&#xff09;&#xff0c;我们习惯把目标数据整体进行一次…