首先,这篇文章是在讲《图论》时候写文章

(所以,还是以理论为主,以后有空的时候,会把代码发上来,不过我觉得大家看完理论,如果讲得好,代码也就比较容易了。如果讲得不好,网上的代码也是大把,不看这篇文章也罢了)


任务目标:

给个起点S,找到图中每个点距离起点S的最小距离(考虑联通性的问题)。


算法思路概述

先选第一个距离S最近的点。之后,更新其他图中的点到S的距离。更新原因:新增加的最近点可以作为一个桥。

  • 输入是:点之间的距离矩阵。
  • 维护是:上面矩阵中的某一行

下图为老师的课件内容部分,我觉得虽然详尽,但也有些枯燥。可能是为了凝练语言吧。如果有耐心看的话,倒真的是一篇非常好的文章。
我在后面会用自己的语言阐述,可能会比较清晰(但废话可能也比较多)。

其中前面的黄色部分是我自己标注的(老师写的),后面的黄色部分是我自己写的。



阐述

  1. 首先,选定一个点v0v0v0,先假设所有的点到某个点的路径都是无穷(当然自己到自己肯定得是长度是0…)。
  2. 然后确定一个集合SSS,这集合表示已经被访问的过点。(那么没有被访问过的点,也是很容易解决的…),这里用个bool数组什么的标记一下吧。
  3. 之后,先更新所有点到这个v0v0v0的距离。怎么更新呢?
  4. 所有点通过已经被访问过的点到达v0v0v0的距离,在结合d(v0,vi)=minvj∈(S)(d(v0,vj)+w(vj,vi))d(v0, vi) = min_{vj \in (S)}(d(v0, vj) + w(vj, vi))d(v0,vi)=minvj∈(S)​(d(v0,vj)+w(vj,vi)) ( 一般就是新增加的那个点考虑下就好了 )。就是在中间搭一个桥,如果,通过这个桥的点会让这个路变得更近,就更新这个路径的长度。
  5. 然后选个最近的点,然后把这个最近的点标记访问过。纳入到集合SSS
  6. 然后,一直到把所有的点都纳入进去之后,就没什么事情了~

这里面,有很多的问题,乍一看都是有点合情合理,但是却让人一下子想不明白的。
归结到一条,就是,为什么这样子,就能保证一定会是得到了所有的点,到这个点v0v0v0的最短距离呢?


证明(不严格的证明)

  1. 首先,我们能保证,拿到的第一个点,一定是跟v0v0v0最近的点。 因为,首先我们选择的是与v0v0v0直接相连的点中到v0v0v0最近的点。如果之后的选的方法得到点,有能够得到的点到v0v0v0的距离小于一开始选的这个点的话,这是不科学的。因为,我们每次选点,都是根据我们维护的一个数组。这个数组的变化过程是,以这个数组中很早就被选中的点的为中转的点,然后,再加上这个中转的点到这个的点的距离,来替代的。但是,我们知道,任意两点的距离都是大于0的,那么,更新的基本算法是“加法”那么更新之后, 怎么可能得到的数是比之前的数要小呢?
  2. 同样的道理,第二次被选的点,一定是比以后要选的点都要更近v0v0v0一点。(最多是相等)。有没有一种感觉,就跟堆排序的方法是一样的。每次,都是把距离v0v0v0最近的点给“生产”出来了。然后不断迭代出所有与v0的点更近的点。

证明(较为严格的证明)

通过归纳法

(1) i=0i = 0i=0
首先,还是一样,根据上面的方式,来依次产生出这些点。这是一个序列,称其为V=v0,v1,v2,....,vnV= {v0, v1, v2, ....,vn}V=v0,v1,v2,....,vn这n个点。vivivi对应的距离就是dididi。

(2) 设i<=ki <= ki<=k时成立,下面看 i=k+1i = k + 1i=k+1的情况

vivivi通过上述方法生成的点,所得到的到v0v0v0的距离不是最近的,也就是说,还存在一条路,使得vivivi到v0v0v0的距离小于dididi。
由于,dididi的产生方法,我们可以知道,这样的点,必定通过了后面的点(vi>=k+2v_{i >= k + 2}vi>=k+2​)。但是,我们同样知道vi>=k+2v_{i >= k + 2}vi>=k+2​到v0v0v0的距离一定是会大于vi<=kv_{i <= k }vi<=k​的。(递增的特点)。所以,只要是通过了后面的点,到达v0v0v0的距离,一定是大于等于,我们只通过前面的点vi<=kv_{i <= k }vi<=k​到达所致的。但是,这与我们之前的假设有矛盾。这样我们就知道了, i=k+1i = k + 1i=k+1时候也是成立的!

综上所述…

迪杰斯特拉算法(Dijkstra)证明相关推荐

  1. dijkstra算法_最短路径问题——迪杰斯特拉算法(Dijkstra)

    假期过长,导致停更了好长时间,复习一道算法题找找感觉. 前段时间看到一篇文章,里面提到了统治世界的十大算法,其中之一就是迪杰斯特拉算法(Dijkstra),该算法主要解决的"最短路径&quo ...

  2. dij算法堆优化_迪杰斯特拉算法(Dijkstra) (基础dij+堆优化) BY:优少

    算法实现步骤: a.初始时,只包括源点,即S = {v},v的距离为0.U包含除v以外的其他顶点,即:U ={其余顶点},若v与U中顶点u有边,则(u,v)为正常权值,若u不是v的出边邻接点,则(u, ...

  3. dij算法堆优化_迪杰斯特拉算法(Dijkstra) (基础dij+堆优化) BY:优少(示例代码)...

    算法实现步骤: a.初始时,只包括源点,即S = {v},v的距离为0.U包含除v以外的其他顶点,即:U ={其余顶点},若v与U中顶点u有边,则(u,v)为正常权值,若u不是v的出边邻接点,则(u, ...

  4. 迪杰斯特拉算法的证明

    求V0到V8的最短距离: 迪杰斯特拉算法的思想是依次求出距离V0第1近,第2近--.一直到第8近,也就是从距离V0最近到最远的点.而每求一个最近距离就修正V0到剩下点的最短距离. 设A为包含V0和已经 ...

  5. 最短路径算法之迪杰斯特拉算法(Dijkstra)和佛洛依德算法(Floyd)

    今天学习了这两种算法,都是用来求最小路径的算法,但是迪杰斯特拉算法只能从某个特定点到所有点的最短路径,而佛洛依德算法可以查出任意点到任意点的最小路径. 迪杰斯特拉: package dijkstra; ...

  6. 最短路径算法-迪杰斯特拉(Dijkstra)

    迪杰斯特拉(Dijkstra) 迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959年提出的,因此又叫狄克斯特拉算法.一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径 ...

  7. c语言迪杰斯特拉算法求最短路径,迪杰斯特拉 ( Dijkstra ) 最短路径算法

    迪杰斯特拉算法介绍 迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径.它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止. 基本 ...

  8. 算法提升:图的Dijkstra(迪杰斯特拉)算法

    目录 概念 思路 代码 概念 迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路 ...

  9. MATLAB轻松绘制地图路线——Dijkstra(迪杰斯特拉)算法最短路径规划

    文章目录 1. 地图绘制 2. 计算各节点之间的距离 3. Dijkstra(迪杰斯特拉)算法 4. 根据计算出的距离利用Dijkstra(迪杰斯特拉)算法找出指定节点之间的最短路径 工程文件(可直接 ...

  10. 《计算机网络自顶向下》之重头戏迪杰斯特拉算法

    迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题.迪杰斯特拉算法主要特 ...

最新文章

  1. ubuntu14.04上搭建android开发环境
  2. Nginx 的启动、停止、平滑重启、信号控制和平滑升级
  3. java温度计的实现_echart 之实现温度计
  4. InnoDB锁机制之Gap Lock、Next-Key Lock、Record Lock解析
  5. AbstractListView源码分析2
  6. POJ - 1966 Cable TV Network(最小割-最大流)
  7. STP安全特性——bpduguard特性、 bpdufilter特性、guard root 特性、loopguard技术总结与案列(附图,建议PC观看)
  8. Google 要进军游戏行业了?!
  9. Android Sensors (3) 传感器坐标系统
  10. 16进制颜色转换为UIColor
  11. windows 监控
  12. 制定自己的SMART目标
  13. Windows Server 2008 R2远程桌面服务配置和授权激活
  14. 【安全资讯】引爆点:过去2020年勒索软件攻击激增62%
  15. 基于PHP+MySQL的汽车零配件生产企业ERP生产管理子系统
  16. 腾讯云服务器架设mir2
  17. Unity2018.3.11下载安装详细图文教程
  18. 蒟蒻的五周总结(解释引用)《挑战》
  19. 用Python分析《斗破苍穹》
  20. B站台湾大学郭彦甫|MATLAB 学习笔记|08 图像处理I Image Processing

热门文章

  1. 武汉区块链软件技术公司:区块链如何化解溯源的短板
  2. 如何优雅的研究 RGSS3 (七) 加入LOGO屏幕
  3. innodb行锁理解
  4. HTML5 处理响应式图片
  5. Effect of Switchovers, Failovers, and Control File Creation on Backups
  6. 算法杂货铺——分类算法之贝叶斯网络(Bayesian networks)
  7. eclipse卸载插件小记
  8. Administer Service Cloud
  9. 计算属性|| 计算属性与方法的区别:计算属性是基于它们的依赖进行缓存的 ;方法不存在缓存||侦听器
  10. 使用 spring 的 IOC 解决程序耦合——获取spring的Ioc核心容器,并根据id获取对象、核心容器的两个接口(ApplicationContext、BeanFactory)引发出的问题