Dijkstra算法是一种计算单源最短无负边路径问题的常用算法之一,时间复杂度为O(n2)

算法描述如下:dis[v]表示s到v的距离,pre[v]为v的前驱结点,用以输出路径,vis[v]表示该点最短路径是否已经确认

初始化:dis[v]=INT dis[s]=0 pre[s]=0

  执行n次

    在没有确定的点中找到一个路径最短的,并修改为已经确认

    通过这个点修改其他所有没有确定的点

    直到所有点已经确认为最短路径,退出循环

现在证明算法的正确性:

首先,我们说明两条性质:

1.确定任何一个点为最短路径时,前驱p一定已经是最短路径(假设源点的前驱是它本身)。

2.任意时刻在还没有确定最短路径的点的集合中路径最短的点就是可以被确定的点。

稍微证明一下这两条性质(反证法):

证明1:假如前驱p还不是最短路径,那么显然当p是最短路径时到当前节点的路径更短,即不是最短路径的节点所确定的节点一定不是最短路径(好像很显然)

证明2:为了方便描述,我们定义已经确定的点为白点,没有确定的点为蓝点。若是蓝点中路径最短x还不能确定为白点,那么x的最短路径上必定存在一个蓝点y。即dis[x]>dis[y]+edge[y][x]。而dis[y]处于两种状态:

(1)dis[y]已经是y点的最短路径,那么显然与dis[x]为蓝点中最短的相矛盾。

(2)dis[y]还不是y点的最短路径,那么它的前驱显然是另外一个蓝点,即dis[y]>=dis[x](这里省略了一些步骤,不过自己稍微想一下,我觉得挺显然的),也矛盾。

综上,性质2得证。

回过头再看我们的算法:

在刚开始的时候,首先确定的最短路(就是直接和源点相连的点)进入白点集合,满足性质1,2。

此后每个过程都满足以上两个性质,所以算法正确。

算法实现:

 1 memset(vis,0,sizeof(vis));
2 vis[s]=1;
3 dis[s]=0;
4 for(int i=1;i<n;i++)
5 {
6 int m=INT_MAX;
7 int k=0;
8 for(int j=1;j<=n;j++)
9 {
10 if(!vis[j] && dis[j]<m)
11 {
12 m=dis[j];
13 k=j;
14 }
15 }
16 if(k==0)
17 break;
18 vis[k]=1;
19 for(int j=1;j<=n;j++)
20 {
21 if(dis[k]+e[k][j]<dis[j])
22 dis[j]=dis[k]+e[k];
23 }
24 }

迪杰斯特拉(Dijkstra)算法描述及理解的更多相关文章

  1. 迪杰斯特拉Dijkstra算法介绍

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

  2. 最短路径算法-迪杰斯特拉(Dijkstra)算法在c#中的实现和生产应用

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

  3. JS实现最短路径之迪杰斯特拉(Dijkstra)算法

    最短路径: 对于网图来说,最短路径是指两个顶点之间经过的边上权值和最少的路径,我们称第一个顶点是源点,最后一个顶点是终点 迪杰斯特拉 ( Dijkstra) 算法是并不是一下子就求出 了 Vo 到V8 ...

  4. 最短路径-迪杰斯特拉(dijkstra)算法及优化详解

    简介: dijkstra算法解决图论中源点到任意一点的最短路径. 算法思想: 算法特点: dijkstra算法解决赋权有向图或者无向图的单源最短路径问题,算法最终得到一个最短路径树.该算法常用于路由算 ...

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

    对于网图来说,最短路径,是指两顶点之间经过的边上权值之和最少的路径,并且我们称路径上的第一个顶点为源点,最后一个顶点为终点.最短路径的算法主要有迪杰斯特拉(Dijkstra)算法和弗洛伊德(Floyd ...

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

    什么是最短路径 在网图和非网图中,最短路径的含义是不一样的.对于非网图没有边上的权值,所谓的最短路径,其实就是指两顶点之间经过的边数最少的路径. 对于网图,最短路径就是指两顶点之间经过的边上权值之和最 ...

  7. 单源最短路径算法:迪杰斯特拉 (Dijkstra) 算法(二)

    一.基于邻接表的Dijkstra算法 如前一篇文章所述,在 Dijkstra 的算法中,维护了两组,一组包含已经包含在最短路径树中的顶点列表,另一组包含尚未包含的顶点.使用邻接表表示,可以使用 BFS ...

  8. C# 迪杰斯特拉(Dijkstra)算法

    Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止. 其基本思想是,设置顶点集合S并不断地作 ...

  9. 单源最短路径算法:迪杰斯特拉 (Dijkstra) 算法(一)

    一.算法介绍 迪杰斯特拉算法(英语:Dijkstra's algorithm)由荷兰计算机科学家艾兹赫尔·迪杰斯特拉在1956年提出.迪杰斯特拉算法使用了广度优先搜索解决赋权有向图的单源最短路径问题. ...

随机推荐

  1. nginx+tomcat:动静分离+https

    nginx server { listen 80; server_name 192.168.0.103; # http访问重写为https rewrite ^ https:/$http_host$re ...

  2. bzoj 2780

    后缀自动机的应用 首先我们观察到:如果一个询问串的答案不为0,那么这个串一定是至少一个模式串的子串 如果只有一个模式串,那么这个问题可以简单地用什么东西解决掉(比如普通后缀自动机) 而这里有很多模式串 ...

  3. 微信小程序支付开发之申请退款

    微信小程序支付跟微信公众号支付类似,这里不另做记录,如果没有开发过支付,可以查看我关于微信支付的文章 重点记录微信小程序申请退款开发过程中遇到一些坑. 退款接口比支付接口接口多了一个 双向证书 证书介 ...

  4. Git一些简单但非常重要并常用的操作命令

    1.将本地与github进行关联配置 生成公钥 ssh-keygen -t rsa -C "jiasheng.mei@hpe.com" 将公钥拷贝到github中 在公钥同文件夹( ...

  5. python面试题整理

    1.谈谈你对csrf的理解和django中CSRF防护机制. 什么是 CSRF CSRF, Cross Site Request Forgery, 跨站点伪造请求.举例来讲,某个恶意的网站上有一个指向 ...

  6. SQL反模式学习笔记13 使用索引

    目标:优化性能 改善性能最好的技术就是在数据库中合理地使用索引.  索引也是数据结构,它能使数据库将指定列中的某个值快速定位在相应的行. 反模式:无规划的使用索引 1.不使用索引或索引不足 2.使用了 ...

  7. jquery动态添加的元素不能直接应用事件方法的时候

    对于由 jQuery 动态生成的元素,如用 jQuery 给元素添加 class,或者直接添加一对 p 标签,不能直接绑定常用的事件,如 click.因为这些元素属于动态生成,除非采用 onclick ...

  8. 前后台得到WEB应用的名称

    前台得到当前应用的名称: ${ pageContext.request.contextPath } 后台得到当前应用的名称: request.getServletContext().getContex ...

  9. 浅析uWSGI、uwsgi、wsgi

    WSGI协议 首先弄清下面几个概念: WSGI:全称是Web Server Gateway Interface,WSGI不是服务器,python模块,框架,API或者任何软件,只是一种规范,描述web ...

  10. django——form组件

    1.html表单概述 Django开发的是动态Web服务,而非单纯提供静态页面.动态服务的本质在于和用户进行互动,接收用户的输入,根据输入的不同,返回不同的内容给用户.返回数据是我们服务器后端做的,而 ...