问题:求图中点1到其他各点的最短距离
策略:
1.把起点1放入初始集合Set中,从剩余的点中,选取到Set(此时Set中只有1个点)距离最近的点,并入集合Set中,
2.从剩余的点中,找经过集合Set,到起点1的最短距离,将最短边并入Set集合
3.依次循环,直到所有的边都并入Set
 
变量的命名:
Set={1,2,,,,,,x}      //已找到start(本例中是1点)到1,2,,,,,x的最短路径的点的集合Set
dist[u]:             //从start点开始,经过Set中的点,到u点的最短距离
short[u]:             //从start开始到u的全局最短路径(不一定经过Set中的点)
可知short[u] <= dist[u]
 
证明过程:
命题:算法进行到第k步时,Set中的每个节点Set_i的dist[Set_i]等于全局最短路径short[Set_i]
(第n步时,dist[n]=short[n],此时找到点1到所有点的最短距离)
 
归纳基础:
  k=1,Set={start_point} => dist[start_point] == short[start_point] ==0,命题正确
 
归纳假设:
  第k步成立,则第k+1步成立
  设k+1步选择了顶点v(v是剩余集合中,经过Set到start_point距离最近的点)
  该顶点与Set中的u点相连, 欲证dist[v] == short[v]
 
    反证法:假设命题不正确,即:存在start_point到点v的更短路径 L(绿色部分)为最短路径short[v],
    该路径经过集合中的最后一个点为last_point,经过未收录集合的点集 uncollected_point_set中的,任1个或者多个点到达v.
    本例以单点y为例,多点同理:(v和last_point不可能直接相连,若直接相连,因为dist[v]最后一点经过u,且为最短,此时L必然>=dist[v],不是更短路径)
                   
    此时 L == dist[y] + distance[y, v] == short[v]
   
    
    由题意知,dist[v] <= dist[y]
 
    =>
                   dist[v] <= L  == short[v]
 
    dist[v]是相对于L更短的路径=>假设不成立,不存在更短的路径L为全局最短路径,第k+1步选择的点即为全局最短路
 
=>
             命题成立!

Dijkstra算法正确性证明的更多相关文章

  1. 互联网IP合全局路由优化的原则-Dijkstra算法证明

    周末继续写东西的一半填补了,为了达到完美的一天.我们知道一个事实,IP地址太多.统一管理是不可能的了,无论从控制平面从数据/管理层表示,飞机是如此. 所以.IP协议被设计为可伸缩.供IP路由术语,跳路 ...

  2. 求两点之间最短路径-Dijkstra算法

     Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.D ...

  3. Dijkstra算法优先队列实现与Bellman_Ford队列实现的理解

    /* Dijkstra算法用优先队列来实现,实现了每一条边最多遍历一次. 要知道,我们从队列头部找到的都是到 已经"建好树"的最短距离以及该节点编号, 并由该节点去更新 树根 到其 ...

  4. 关于dijkstra算法的一点理解

    最近在准备ccf,各种补算法,图的算法基本差不多看了一遍.今天看的是Dijkstra算法,这个算法有点难理解,如果不深入想的话想要搞明白还是不容易的.弄了一个晚自习,先看书大致明白了原理,就根据书上的 ...

  5. 最短路模板(Dijkstra & Dijkstra算法+堆优化 & bellman_ford & 单源最短路SPFA)

    关于几个的区别和联系:http://www.cnblogs.com/zswbky/p/5432353.html d.每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个(草儿家到 ...

  6. Dijkstra算法(二)之 C++详解

    本章是迪杰斯特拉算法的C++实现. 目录 1. 迪杰斯特拉算法介绍 2. 迪杰斯特拉算法图解 3. 迪杰斯特拉算法的代码说明 4. 迪杰斯特拉算法的源码 转载请注明出处:http://www.cnbl ...

  7. Dijkstra算法(一)之 C语言详解

    本章介绍迪杰斯特拉算法.和以往一样,本文会先对迪杰斯特拉算法的理论论知识进行介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现. 目录 1. 迪杰斯特拉算法介绍 2. 迪杰斯特拉算法 ...

  8. 最短路问题Dijkstra算法

    Dijkstra算法可以解决源点到任意点的最短距离并输出最短路径 准备: 建立一个距离数组d[ n ],记录每个点到源点的距离是多少 建立一个访问数组v[ n ],记录每个点是否被访问到 建立一个祖先 ...

  9. dijkstra算法求最短路

    艾兹格·W·迪科斯彻 (Edsger Wybe Dijkstra,1930年5月11日~2002年8月6日)荷兰人. 计算机科学家,毕业就职于荷兰Leiden大学,早年钻研物理及数学,而后转为计算学. ...

随机推荐

  1. 钉钉通知机器人与SpringBoot的集成

    Spring Boot Admin 集成自定义监控告警(2.0.1版本)------钉钉机器人 - yuancao24的博客 - CSDN博客https://blog.csdn.net/yuancao ...

  2. Ubuntu配置国内高速apt-get更新源

    Ubuntu配置国内高速apt-get更新源     具体内容直接参考这篇博客:https://www.linuxidc.com/Linux/2017-11/148627.htm 此网站可直接找到符合 ...

  3. django 实战3 simpleui

    pip3 install django-import-export pip3 install django-simpleui pip3 install mysqlclient python3 mana ...

  4. Access与SQL中的IsNull(),IS NULL的区别

    Access也有IsNull函数,但意义和参数却和T-SQL中的不同. 在T-SQL(也就是SQL Server所支持的SQL语言)中,IsNull的作用是把空值替代成指定的值.然而在Access中, ...

  5. **209. Minimum Size Subarray Sum 长度最小的子数组

    1. 题目描述 给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组.如果不存在符合条件的连续子数组,返回 0. 示例: 输入: s = 7, nu ...

  6. Python - Django - 母版和继承

    可以把多个页面相同的部分提取出来,放在一个母板里,这些页面只需要继承这个母板就好了 通常会在母板中定义页面专用的 CSS 块和 JS 块,方便子页面替换 定义块: {% block 名字 %} {% ...

  7. C语言中结构体的构造函数

    示例代码: #include <iostream> using namespace std; struct Node { int x, y, z; Node(int _x, int _y, ...

  8. Egg.js中使用sequelize事务

    对数据库的操作很多时候需要同时进行几个操作,比如需要同时改动几张表的数据,或者对同一张表中不同行(row)或列(column)做不同操作,比较典型的例子就是用户转账问题(A账户向B账号汇钱): 1 从 ...

  9. mysql order by rand() 优化方法

    mysql order by rand() 优化方法 适用于领取奖品等项目<pre>mysql> select * from user order by rand() limit 1 ...

  10. noVNC使用——访问多台vnc

    一.模拟实验环境 1.CentOS6.8系统2.KVM环境3.使用KVM环境的两个系统(Windows,Linux)4.noVNC5.vncserver 二.实验过程1.在kvm的环境下,通过xml创 ...