Dijkstra算法

1.定义概览

Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。注意该算法要求图中不存在负权边。

问题描述:在无向图 G=(V,E) 中,假设每条边 E[i] 的长度为 w[i],找到由顶点 V0 到其余各点的最短路径。(单源最短路径)

2.算法描述

1)算法思想:设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径 , 就将加入到集合S中,直到全部顶点都加入到S中,算法就结束了),第二组为其余未确定最短路径的顶点集合(用U表示),按最短路径长度的递增次序依次把第二组的顶点加入S中。在加入的过程中,总保持从源点v到S中各顶点的最短路径长度不大于从源点v到U中任何顶点的最短路径长度。此外,每个顶点对应一个距离,S中的顶点的距离就是从v到此顶点的最短路径长度,U中的顶点的距离,是从v到此顶点只包括S中的顶点为中间顶点的当前最短路径长度。

(1) 初始时,S只包含起点s;U包含除s外的其他顶点,且U中顶点的距离为"起点s到该顶点的距离"[例如,U中顶点v的距离为(s,v)的长度,然后s和v不相邻,则v的距离为∞]。

(2) 从U中选出"距离最短的顶点k",并将顶点k加入到S中;同时,从U中移除顶点k。

(3) 更新U中各个顶点到起点s的距离。之所以更新U中顶点的距离,是由于上一步中确定了k是求出最短路径的顶点,从而可以利用k来更新其它顶点的距离;例如,(s,v)的距离可能大于(s,k)+(k,v)的距离。

(4) 重复步骤(2)和(3),直到遍历完所有顶点。

以上图G4为例,来对迪杰斯特拉进行算法演示(以第4个顶点D为起点)。

初始状态:S是已计算出最短路径的顶点集合,U是未计算除最短路径的顶点的集合!
第1步:将顶点D加入到S中。
    此时,S={D(0)}, U={A(∞),B(∞),C(3),E(4),F(∞),G(∞)}。     注:C(3)表示C到起点D的距离是3。

第2步:将顶点C加入到S中。
    上一步操作之后,U中顶点C到起点D的距离最短;因此,将C加入到S中,同时更新U中顶点的距离。以顶点F为例,之前F到D的距离为∞;但是将C加入到S之后,F到D的距离为9=(F,C)+(C,D)。
    此时,S={D(0),C(3)}, U={A(∞),B(13),E(4),F(9),G(∞)}。

第3步:将顶点E加入到S中。
    上一步操作之后,U中顶点E到起点D的距离最短;因此,将E加入到S中,同时更新U中顶点的距离。还是以顶点F为例,之前F到D的距离为9;但是将E加入到S之后,F到D的距离为6=(F,E)+(E,D)。
    此时,S={D(0),C(3),E(4)}, U={A(∞),B(13),F(6),G(12)}。

第4步:将顶点F加入到S中。
    此时,S={D(0),C(3),E(4),F(6)}, U={A(22),B(13),G(12)}。

第5步:将顶点G加入到S中。
    此时,S={D(0),C(3),E(4),F(6),G(12)}, U={A(22),B(13)}。

第6步:将顶点B加入到S中。
    此时,S={D(0),C(3),E(4),F(6),G(12),B(13)}, U={A(22)}。

第7步:将顶点A加入到S中。
    此时,S={D(0),C(3),E(4),F(6),G(12),B(13),A(22)}。

此时,起点D到各个顶点的最短距离就计算出来了:A(22) B(13) C(3) D(0) E(4) F(6) G(12)

Dijkstra算法原理相关推荐

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

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

  2. 简述dijkstra算法原理_理解最短路径——迪杰斯特拉(dijkstra)算法

    1.       迪杰斯特拉算法简介 迪杰斯特拉(dijkstra)算法是典型的用来解决最短路径的算法,也是很多教程中的范例,由荷兰计算机科学家狄克斯特拉于1959年提出,用来求得从起始点到其他所有点 ...

  3. 简述dijkstra算法原理_Dijkstra算法之 Java详解

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

  4. Dijkstra算法原理及代码实现

    算法简介 Dijkstra算法是一种全局路径规划算法,是从一个节点遍历其余各节点的最短路径算法,解决的是有权图中最短路径问题. 算法思想 设G=(V,E)是一个带权有向图,把图中节点集合V分成两组,第 ...

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

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

  6. A-star 算法原理分析

    搜索算法 图论中,应用最广泛的就是搜索算法了,比如,深度优先搜索.广度优先搜索等.在介绍 Dijkstra 算法那篇中,除了深度优先.广度优先这种暴力搜索算法,还有一些最短路算法也可以求得最短路径,并 ...

  7. 第5-3课:Dijkstra 算法

    Dijkstra 算法是有中文名字的,一般叫做"迪杰斯特拉算法",该算法是求解单源最短路径问题的经典算法,算不上高效,但确实是最简单的算法.Dijkstra 算法并不难,很多算法书 ...

  8. Dijkstra算法实现(java)

    一.Dijkstra算法介绍   Dijkstra(迪杰斯特拉)算法是求解单源最短路径的经典算法,其原理也是基于贪心策略的. 二.Dijkstra算法原理   Dijkstra算法设置一个集合SSS记 ...

  9. C语言贪吃蛇最短路径,AI贪吃蛇前瞻——基于Dijkstra算法的最短路径问题

    在贪吃蛇流程结构优化之后,我又不满足于亲自操刀控制这条蠢蠢的蛇,干脆就让它升级成AI,我来看程序自己玩,哈哈. 一.Dijkstra算法原理 作为一种广为人知的单源最短路径算法,Dijkstra用于求 ...

  10. 自动驾驶路径规划——Dijkstra算法

    目录 前言 1. 深度优先(DFS)和广度优先(BFS) 2. 深度优先搜索(DFS) 2.1 算法基本思想 2.2 深度优先搜索算法(C) 3. 广度优先搜索(BFS) 3.1 算法基本思想 3.2 ...

最新文章

  1. bigdecimal 小于等于0_图解小于 K 的两数之和
  2. python怎么运行matlab代码_用python运行matlab代码
  3. Ajax Login Sample
  4. Java并发编程之Java线程池
  5. 论文《Learning Spatial Fusion for Single-Shot Object Detection》解读
  6. python地址多少位_Python获取IP地址对应的地理位置信息!
  7. OpenCV-图像阴影调整
  8. Oracle用户密码过期的处理方法
  9. BZOJ3091 城市旅行
  10. creo数控编程怎么样_Creo4.0数控加工教程
  11. mysql大于小于索引问题
  12. 【DM】Combating Web Spam with TrustRank - 用TrustRank对抗网络垃圾邮件
  13. 脾气暴躁的 Linus 不大可能开喷修改 master
  14. java生成有序的序号,java生成序号
  15. java求两个非零正整数的最大公约数和最小公倍数
  16. dell服务器新bois系统设置u盘启动,戴尔新版本的bios怎样设置U盘启动
  17. 方舟:生存进化官服和私服区别
  18. 水星MW300R无线路由器无线网频繁掉线的解决方法除了重启路由还有???
  19. doNet面试宝典-常见整理(重复率高)
  20. 论文阅读之《Quasi-Unsupervised Color Constancy 》

热门文章

  1. JS小图切换大图轮播代码
  2. CSS4.2.3 参考手册.CHM
  3. html转word 文档 doc docx
  4. 步进电机驱动器单片机控制电路
  5. itext 生成 PDF
  6. c语言在线考试系统的需求分析,在线考试系统需求分析.doc
  7. 小白入门该如何学习PR视频剪辑软件及辅助工具的使用呢?
  8. android 视频编辑应用,安卓视频剪辑软件推荐
  9. 小米笔记本Pro15寸单系统黑果体验
  10. 逻辑回归(LR) 算法模型简介