基本原理

Dijkstra算法是根据贪心算法实现的,首先找出当前点到所有能到达的点之间最短的距离,然后松弛一次继续循环。所谓松弛一次,就是在已经访问过的点中遍历一遍,看看有没有更近的,如果有更近的就更新距离。这样每次找最近的可达点+松弛遍历历史节点的操作,一直重复就能找到最短路径。
迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径。
它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止。

算法步骤

  1. 指定起始点s。
  2. 找到起始点相邻的点开始记录
  3. 将第二步记录的点作为起始点,如果第二部记录了多个点的话,那么按照与起始点s的距离或者权值,其中权值最小的优先依次作为起始点。
  4. 直到遍历完图中所有的点。

过程图解

known表示是否已知,dv表示临时距离,这个距离实际上是使用已知定点作为中间顶点从s到v的最短路径长,pv记录一起dv变换的最后的顶点

初始配置表

v Known dv pv
v1 0 0 0
v2 0 0
v3 0 0
v4 0 0
v5 0 0
v6 0 0
v7 0 0

在v1被声明为已知后的表

v Known dv pv
v1 1 0 0
v2 0 2 v1
v3 0 0
v4 0 1 v1
v5 0 0
v6 0 0
v7 0 0

在v4被声明为已知后的表

v Known dv pv
v1 1 0 0
v2 0 2 v1
v3 0 3 v4
v4 1 1 v1
v5 0 3 v4
v6 0 9 v4
v7 0 5 v4

在v2被声明为已知后的表

v Known dv pv
v1 1 0 0
v2 1 2 v1
v3 0 3 v4
v4 1 1 v1
v5 0 3 v4
v6 0 9 v4
v7 0 5 v4

在v5然后v3被声明为已知后的表

v Known dv pv
v1 1 0 0
v2 1 2 v1
v3 1 3 v4
v4 1 1 v1
v5 1 3 v4
v6 0 8 v3
v7 0 5 v4

在v7被声明为已知后的表

v Known dv pv
v1 1 0 0
v2 1 2 v1
v3 1 3 v4
v4 1 1 v1
v5 1 3 v4
v6 0 6 v7
v7 1 5 v4

在v6被声明为已知后的表

v Known dv pv
v1 1 0 0
v2 1 2 v1
v3 1 3 v4
v4 1 1 v1
v5 1 3 v4
v6 1 6 v7
v7 1 5 v4

至此我们可以得出从v1出发到所有点的最短路径

伪代码

Dijkstar算法的声明

typeof int Vertex;struct TableEntry
{List Header; /*Adjacency list*/int Known;DistType Dist;Vertex Path;
}
/*Vertices are numbered from 0*/
#define NotAVertex(-1)
typeof struct TableEntry Table[NumVertex];

表初始化例程

void InitTable(Vertex Start, Graph G, Table T)
{int i;ReadGraph(G,T);for(i=0; i<NumVertex; i++){T[i].Known = false;T[i].Dist = Infinity;T[i].Path = NotVertex;    }T[Start].dist = 0;
}

显示实际最短路径的例程

void PrintPath(Vertex V, Table T)
{if(T[V].Path != NotVertex){PrintPath(T[V].Path,T);prithf("to");}printf("%v",V) /*%v is pseudocode*/
}

Dijkstra算法

void Dijkstra(Table T)
{Vertex V, W;for(; ;){V = smallest unkonwn diatance vertex;if(V = NotVertex){break;}T[V].Known = true;for each W adjacent to V{  if(!T[W].Known){if(T[V].Dist + Cvw < T[W].Dist){Decrease(T[W].Dist to T[V].Dist + Cvw);T[W].Path = V;}}}}}

例题

有 N 个网络节点,标记为 1 到 N。 给定一个列表 times,表示信号经过有向边的传递时间。 times[i] = (u, v,w),其中 u 是源节点,v 是目标节点, w 是一个信号从源节点传递到目标节点的时间。 现在,我们从某个节点 K发出一个信号。需要多久才能使所有节点都收到信号?如果不能使所有节点收到信号,返回 -1。
输入:times =[[2,1,1],[2,3,1],[3,4,1]], N = 4, K = 2
输出:2

算法思路
将所有节点分成两类:已确定从起点到当前点的最短路长度的节点,以及未确定从起点到当前点的最短路长度的节点(下面简称「未确定节点」和「已确定节点」)。

每次从「未确定节点」中取一个与起点距离最短的点,将它归类为「已确定节点」,并用它「更新」从起点到其他所有「未确定节点」的距离。直到所有点都被归类为「已确定节点」。

用节点 A「更新」节点 B 的意思是,用起点到节点 A 的最短路长度加上从节点 A 到节点 B 的边的长度,去比较起点到节点 B 的最短路长度,如果前者小于后者,就用前者更新后者。这种操作也被叫做「松弛」。

这里暗含的信息是:每次选择「未确定节点」时,起点到它的最短路径的长度可以被确定。

可以这样理解,因为我们已经用了每一个「已确定节点」更新过了当前节点,无需再次更新(因为一个点不能多次到达)。而当前节点已经是所有「未确定节点」中与起点距离最短的点,不可能被其它「未确定节点」更新。所以当前节点可以被归类为「已确定节点」。

class Solution {public:int networkDelayTime(vector<vector<int>> &times, int n, int k) {const int inf = INT_MAX / 2;vector<vector<int>> g(n, vector<int>(n, inf));for (auto &t : times) {int x = t[0] - 1, y = t[1] - 1;g[x][y] = t[2];}vector<int> dist(n, inf);dist[k - 1] = 0;vector<int> used(n);for (int i = 0; i < n; ++i) {int x = -1;for (int y = 0; y < n; ++y) {if (!used[y] && (x == -1 || dist[y] < dist[x])) {x = y;}}used[x] = true;for (int y = 0; y < n; ++y) {dist[y] = min(dist[y], dist[x] + g[x][y]);}}int ans = *max_element(dist.begin(), dist.end());return ans == inf ? -1 : ans;}
};

Dijkstra算法基础相关推荐

  1. HDU3790 最短路径问题【Dijkstra算法】

    最短路径问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  2. dijkstra算法原理_这 10 大基础算法,程序员必知必会!

    来源:博客园原文地址:http://kb.cnblogs.com/page/210687/算法一:快速排序算法快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序n个项目要Ο(nlogn)次 ...

  3. 基础实验8-1.2 直捣黄龙 (Dijkstra算法)

    本题是一部战争大片 -- 你需要从己方大本营出发,一路攻城略地杀到敌方大本营.首先时间就是生命,所以你必须选择合适的路径,以最快的速度占领敌方大本营.当这样的路径不唯一时,要求选择可以沿途解放最多城镇 ...

  4. 【路径规划】Dijkstra算法——超详细原理图解

    Dijkstra算法详解 1. Dijkstra算法原理  1.1. 有向图的Dijkstra算法  1.2. 无向图和栅格网络的拓展   1.2.1. 无向图   1.2.2. 栅格网络 2. Di ...

  5. 一步一步深入理解Dijkstra算法

    先简单介绍一下最短路径: 最短路径是啥?就是一个带边值的图中从某一个顶点到另外一个顶点的最短路径. 官方定义:对于内网图而言,最短路径是指两顶点之间经过的边上权值之和最小的路径. 并且我们称路径上的第 ...

  6. 【爬虫、算法】基于Dijkstra算法的武汉地铁路径规划!

    作者:牧小熊,华中农业大学,Datawhale原创作者 前言 最近爬取了武汉地铁线路的信息,通过调用高德地图的api 获得各个站点的进度和纬度信息,使用Dijkstra算法对路径进行规划. 1.数据爬 ...

  7. 牛客网 短最优升级路径 【Dijkstra算法】+【路径记录】

    链接:https://www.nowcoder.com/questionTerminal/a7052c5bd8634edb9ccee711a5c1ea54 来源:牛客网 短最优升级路径 题目描述:游戏 ...

  8. dijkstra算法c++_Matlab 二维模拟退火算法最优路径(主程序)

    这部分承接Dijkstra算法的基础之上,先算出单源最短路径(绿线), 之后把经过的每个虚线段分成1000份,它们的基准点分别是b1.b2等 随机产生一系列1000的数字排列成1*6的矩阵代入模拟退火 ...

  9. 【算法】prim算法(最小生成树)(与Dijkstra算法的比较)

    最小生成树: 生成树的定义:给定一个无向图,如果它的某个子图中任意两个顶点都互相连通并且是一棵树,那么这棵树就叫做生成树.(Spanning Tree) 最小生成树的定义:在生成树的基础上,如果边上有 ...

最新文章

  1. [转载]Shark Machine Learning Library --之运行篇
  2. 自制一个 elasticsearch-spring-boot-starter
  3. Java之SPI机制
  4. csp 通信网络 java_CSP 通信网络
  5. mysql 函数 局部变量_MySQL 存储过程 存储函数 局部变量 游标 概念示例
  6. js java socket_js使用WebSocket,java使用WebSocket
  7. caas k8s主控节点如何查询_k8s--04 部署harbor作为k8s镜像仓库
  8. TensorFlow学习笔记:使用Inception v3进行图像分类
  9. UI设计师素材干货|APP底部导航模板
  10. mysql 查询排序位置_MySQL-基础查询与排序
  11. wangeditor中添加超链接校验
  12. hibernate中session 与JDBC中 connection分析
  13. android libyuv库的使用
  14. AlphaFold2: Highly accurate protein structure prediction with AlphaFold笔记
  15. 专题:固体力学中应力与应变分析详解(7.应变分析 7.5应变张量 7.6主应变与主方向 7.7应变莫尔圆)...
  16. jQuery扁平化风格手风琴菜单
  17. 区间dp(含模板及例题)
  18. 币圈暴涨暴跌有这五大技巧就够了
  19. 激活休眠软件资产 提升企业软实力
  20. persevere的用法_persevere是什么意思_persevere的翻译_音标_读音_用法_例句_爱词霸在线词典...

热门文章

  1. CSS - SCSS
  2. Unity 3D 学习经验总结
  3. 住宅小区智能化系统概述
  4. 民锋国际期货量化交易策略源代码大全
  5. 汽车电子芯片用在哪些电子组件上?
  6. 《公司的力量》第三集:猎富时代 解说词
  7. [选拔赛]蜗牛!快爬!
  8. Elasticsearch 7.x修改/忘记密码
  9. C语言结合gnuplot绘制离散时间系统的频率响应曲线
  10. DNS劫持与DNS污染