迪杰斯特拉(Dijkstra)算法描述及理解
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)算法描述及理解的更多相关文章
- 迪杰斯特拉Dijkstra算法介绍
迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径. 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止. 基本思想 通过Dijk ...
- 最短路径算法-迪杰斯特拉(Dijkstra)算法在c#中的实现和生产应用
迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径. 它的主要特点是以起始点为中心向外层层扩展(广度优先遍历思想),直到扩展到终点为止 贪心算法(Greedy ...
- JS实现最短路径之迪杰斯特拉(Dijkstra)算法
最短路径: 对于网图来说,最短路径是指两个顶点之间经过的边上权值和最少的路径,我们称第一个顶点是源点,最后一个顶点是终点 迪杰斯特拉 ( Dijkstra) 算法是并不是一下子就求出 了 Vo 到V8 ...
- 最短路径-迪杰斯特拉(dijkstra)算法及优化详解
简介: dijkstra算法解决图论中源点到任意一点的最短路径. 算法思想: 算法特点: dijkstra算法解决赋权有向图或者无向图的单源最短路径问题,算法最终得到一个最短路径树.该算法常用于路由算 ...
- 最短路径 - 迪杰斯特拉(Dijkstra)算法
对于网图来说,最短路径,是指两顶点之间经过的边上权值之和最少的路径,并且我们称路径上的第一个顶点为源点,最后一个顶点为终点.最短路径的算法主要有迪杰斯特拉(Dijkstra)算法和弗洛伊德(Floyd ...
- 图的最短路径---迪杰斯特拉(Dijkstra)算法浅析
什么是最短路径 在网图和非网图中,最短路径的含义是不一样的.对于非网图没有边上的权值,所谓的最短路径,其实就是指两顶点之间经过的边数最少的路径. 对于网图,最短路径就是指两顶点之间经过的边上权值之和最 ...
- 单源最短路径算法:迪杰斯特拉 (Dijkstra) 算法(二)
一.基于邻接表的Dijkstra算法 如前一篇文章所述,在 Dijkstra 的算法中,维护了两组,一组包含已经包含在最短路径树中的顶点列表,另一组包含尚未包含的顶点.使用邻接表表示,可以使用 BFS ...
- C# 迪杰斯特拉(Dijkstra)算法
Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止. 其基本思想是,设置顶点集合S并不断地作 ...
- 单源最短路径算法:迪杰斯特拉 (Dijkstra) 算法(一)
一.算法介绍 迪杰斯特拉算法(英语:Dijkstra's algorithm)由荷兰计算机科学家艾兹赫尔·迪杰斯特拉在1956年提出.迪杰斯特拉算法使用了广度优先搜索解决赋权有向图的单源最短路径问题. ...
随机推荐
- Python 爬虫 JD商品-scrapy+requests
目标站点需求分析 JD商品信息抓取 需求信息字段 涉及的库 scrapy, requests,re lxml 获取单页源码 解析单页源码 获取总页数 获取商品url 解析商品信息 保存本地文件 保存m ...
- C# ClickOnce部署WinForm程序
之前做过ClickOnce部署应用程序的项目,今天做一次全面的总结.那么这些都是微软提供方便分布式部署的相关解决方法,这种方法既有弊端,也有优点. 最大的缺点: 远程部署,不能更换安装目录:并且每次安 ...
- vue app混合开发蓝牙串口连接(报错java.io.IOException: read failed, socket might closed or timeout, read ret: -1;at android.bluetooth.BluetoothSocket.connect at js/BluetoothTool.js:329)
我使用的uni-app <template> <view class="bluetooth"> <!-- 发送数据 --> <view c ...
- npm脚本传参问题
npm脚本传参问题(比如设置env参数) windows环境下: "build": "set NODE_ENV=dev&& gulp", &qu ...
- C#学习-子类的初始化顺序
使用了继承之后,当我们初始化一个子类时,除了会调用子类的构造函数外,同时也会调用基类的构造函数. 子类的初始化顺序如下: (1)初始化类的实例字段: (2)调用基类的构造函数: (3)调用子类的构造函 ...
- Swagger-概述
前言 Swagger 是一款RESTFUL接口的文档在线自动生成+功能测试功能软件.本文简单介绍了在项目中集成swagger的方法和一些常见问题.如果想深入分析项目源码,了解更多内容,见参考资料. S ...
- call、apply、bind
***call,apply,bind 替换this 何时: 只要this不是想要的都可用call,apply,bind替换 选择: call/apply: *调用*函数,在调用时,*临时*替换函数中的 ...
- Java 使用blob对H5视频播放进行加密《java视频加密》
1.创建一个H5 <video>标签 <video id="sound" type="video/mp4" controls="co ...
- add, subtract, multiply, divide
加.减.乘.除:add, subtract, multiply, divide
- VScode查找替换常用正则表达式
1.从字符串开始到结束,例如:<a href="#">测试</a> (<'.*?>) //匹配到整个a标签 (>'.*?<) //匹 ...