IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 【数据结构基础C++】图论10-单源最短路径(Dijkstra’s shortest path algorithm) -> 正文阅读

[数据结构与算法]【数据结构基础C++】图论10-单源最短路径(Dijkstra’s shortest path algorithm)

过程

在这里插入图片描述
假设上图中的顶点代表各个城市,每条边的权值代表城市间的路程长度。0->5 表示可以从城市 0 直达城市 5,路程长度 10;0->2->3->5 代表可以经过城市 2,3 到达城市 5,路程长度 7。
你想要找到从城市0到城市5的最短路程,或者从城市0到其余各个城市的最短路程。这就是单源最短路径问题:给定带权图G和源点v,求从v到图G中其余各顶点的最短路径。
如何求得这些路径?迪杰斯特拉(Dijkstra)提出了一个按路径长度递增的次序产生最短路径算法。(条件:所有边的权值为正。)

  1. 用一个数组D记录源点到各点的最短路径长度。假设源点为 0 (出发点),则D[3]表示从点0到点3当前的最短路径长度。

  2. 数组D的初始状态:源点0到自身的距离为0,D[0]= 0;若源点0到其余顶点i有边,则D[i]为边的权值;否则D[i]为∞,表示没有直达路径;上图初始状态:
    在这里插入图片描述
    3.类似Prim算法,我们需要两个集合,一个集合包含最短路径树的顶点,另一个集合是还没加入到最短路径树的顶点。此上图中,
    在这里插入图片描述
    此时我们如果找到没有访问的顶点集合中,能够以最短方式抵达的那个顶点,在例子中为顶点2,权值为1,那就说从源点0到顶点2,它的最短路径就是1。

  3. 确定新的顶点的最短路径后,将顶点2加入最短路径树的集合,再看顶点2的所有邻边。只有一条邻边2->3,权值为5;因为D[3] = ∞,表示源点0到顶点3没有路径,此时通过边2->3,有了从源点0到3 的路径:0->2->3,权值为1+5 = 6 ,比我们现在要存的D[3] = ∞ 要短,所以在数组D[3]中要更新记录更小的路径长度:D[3]= 1+5 = 6;
    在这里插入图片描述

  4. 此时从还没有知道最短路径的这些顶点中,现在存的那个最短路径能抵达的顶点是谁,上图中是D[4] = 3,也就是顶点4,找到的这条路径就是从 0 到 4 的最短路径。因为到其他的节点所需要的路程更长,若以这些节点为中转点,再返回到顶点4的话,将会花费更多的路程。找到最短路径后,将顶点加入最短路径树的集合中。
    在这里插入图片描述

  5. 访问新加入的顶点4的邻边,看是否能以顶点4作为中转到达其他顶点的路径是否更短一些;
    邻边4->3:由于0->3,D[3] = 6,而4->3的路径长度为2,从0->4->3 就找到以了一条权值为 3+2 = 5 的路径,比现存的D[3] = 6要小,就可以更新数组D[3]的值为5;之前的0->2->3就可以要了。
    邻边4->5:由于0->5,D[5] = 10,而4->5的路径长度为6,从0->4->5 就找到了一条权值为 3+6= 9 的路径,比现存的D[5]= 10 要小,更新数组D[5] = 0;
    重复步骤4,找出现在存的那个最短路径能抵达的顶点是谁,上图中是D[3] = 6。
    在这里插入图片描述

  6. 访问顶点3的邻边,重复上述过程。
    在这里插入图片描述

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-12-26 22:27:24  更:2021-12-26 22:28:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 17:21:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码