一.算法特点

目标:找出加权图中前往X的最短路径

适用于:无环有向加权图,且各边的权值为正

二.算法思路

三.算法示例演示

如下图,请找出结点v1到其他各个结点的最短路径:

首先创建一个字典(散列表),该字典的键表示结点名字,值表示从v1到该结点的最短路径。下图中,字典初始化后只有v1的邻居节点被写入值:

按照算法的思路,我们先找到距离起点最近的结点(v3),结点v3已经是最短路径了(因为迪杰特斯拉算法处理的是边权值为正的图,所以经其他任何节点再到v3的路径和不会小于v1到v3的权值,之后的步骤同理)。接着寻找v3的邻居节点(v4),更新v4的开销为10+50=60。此外,要完成这个需求,还应该定义一个字典,保存结点的父节点信息。此处将v4的父节点标为v3,并且把v3标记为处理过的结点。

接着再找到下一个距离v1最近并且没有被标记过的结点,重复以上步骤,v5的邻居节点有v4和v6两个,经过v5到达v4和v6的路径分别为50和90,将字典中对应的值修改后,将v4和v6的父节点改为v5(此处若经过v5的值大于原来的值则不应该修改父节点),标记v5为已处理结点。

继续按照循环的思路,最后字典被修改为:

到目前,只有v2结点没有被处理过了。然而此时应当理解∞的含义,即没有任何一个结点可以到达v2结点,因此v2结点是不可到达的,没有最近距离。通过上述字典和记录父节点的列表即可求出最短距离及最短路径。

四.算法实现(Python)

图算法之——dijkstra算法的更多相关文章

  1. 【图算法】Dijkstra算法及变形

    图示: 模版: /* Dijkstra计算单源最短路径,并记录路径 m个点,n条边,每条边上的权值非负,求起点st到终点et的最短路径 input: n m st et 6 10 1 6 1 2 6 ...

  2. 单源最短路径-Dijkstra算法

    1.算法标签 贪心 2.算法描述 具体的算法描述网上有好多,我觉得莫过于直接wiki,只说明一些我之前比较迷惑的. 对于Dijkstra算法,最重要的是维护以下几个数据结构: 顶点集合S : 表示已经 ...

  3. 单源最短路径(1):Dijkstra 算法

    一:背景 Dijkstra 算法(中文名:迪杰斯特拉算法)是由荷兰计算机科学家 Edsger Wybe Dijkstra 提出.该算法常用于路由算法或者作为其他图算法的一个子模块.举例来说,如果图中的 ...

  4. 最短路径问题---Dijkstra算法详解

    侵删https://blog.csdn.net/qq_35644234/article/details/60870719 前言 Nobody can go back and start a new b ...

  5. 最短路径问题的Dijkstra算法

      问题 最短路径问题的Dijkstra算法 是由荷兰计算机科学家艾兹赫尔·戴克斯特拉提出.迪科斯彻算法使用了广度优先搜索解决非负权有向图的单源最短路径问题,算法终于得到一个最短路径树>    ...

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

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

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

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

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

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

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

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

随机推荐

  1. [shell]find命令

    find ./ -mtime 18 -exec ls -l {} \; 该范例中特殊的地方有 {} 以及 \; 还有 -exec 这个关键字,这些东西的意义为: {} 代表的是『由 find 找到的内 ...

  2. Linux中硬盘物理扇区与文件系统文件对应关系(转)

    1               概述 系统读写文件过程中,如下面内核打印信息,报告读写某个扇区错误.那么我们如何能够通过sector找到读写哪个文件错误? kernel: end_request: I ...

  3. py-day1-3 python基本数据类型

    数据的基本类型: 数字:

  4. xe5 android 控制蓝牙[转]

    用以下代码中的接口实现控制蓝牙的开.关及详细信息 unit Androidapi.JNI.BluetoothAdapter; // (c) RedTitan Technology 2013// JNI ...

  5. 1.linux6 x86-64 RPM包安装mysql5.7.20

    注意版本和此次更新时间 2017-12-03  版本:mysql-5.7.20-1.el6.x86_64  环境:linux6.x ​官方下载地址: wget https://dev.mysql.co ...

  6. elixir环境配置

    mac下 brew install elixir debian下版本可能太低,需要kiex 安装 curl -sSL https://raw.githubusercontent.com/taylor/ ...

  7. Map集合利用比较器Comparator根据Key和Value的排序

    TreeMap排序 根据Key进行排序 Map的根据key排序需要用到TreeMap对象,因为它是默认按照升序进行输出的,可以使用比较器compareTo对它进行降序排序,Comparator可以对集 ...

  8. 【java】之正则表达式摘要

    构造 匹配 字符 x 字符 x \\ 反斜线字符 \0n 带有八进制值 0 的字符 n (0 <= n <= 7) \0nn 带有八进制值 0 的字符 nn (0 <= n < ...

  9. Apple公司Darwin流式服务器源代码分析

    当前,伴随着Internet的飞速发展,计算机网络已经进入到每一个普通人的家庭.在这个过程中,一个值得我们关注的现象是:Internet中存储和传输内容的构成已经发生了本质的改变,从传统的基于文本或少 ...

  10. 了解轮询、长轮询、长连接、websocket

    业务开发中我们往往会有一些需要即时通信的场景,比如微信扫码登录.聊天功能. 下面这四种方式都可以实现即时通信. 轮询: 浏览器通过定时器每隔一段时间向服务器端发送请求,服务器端收到请求并响应请求.没有 ...