当前位置: 首页 > news >正文

迪杰斯特拉算法的理解

图片转载自:最短路径算法-迪杰斯特拉(Dijkstra)算法 - 程序小哥爱读书的文章 - 知乎
https://zhuanlan.zhihu.com/p/346558578
迪杰斯特拉,一个广度优先算法,采用了贪心策略。
在这里插入图片描述

在这里插入图片描述
第一步,选取顶点D,更新和D相连的节点C,E

第二步,选取顶点C,因为和D直接相连的就只有C,D,他俩之中必然有一个是最短的,而且此时C到D的最短路径已经确定了,为什么?因为不可能存在另一个节点X能连接D和C了,所以C是确定了的,那么,我们再以C来更新别的,更新和C相连的,发现能更新B,F,E不能更新,从D到E的已经最短了。

第三步,选出E,为什么能确定E是最短的,因为现在E的最短路径,是从S集合里的每一个点更新而来的,不可能存在一个点在D和E之间,如果有,早就被加到S中去了,所以E一定是最短的。E可以加入S中,并且以E来更新新的节点,能更新F和G。这里我么发现,D->C->F这条路径会被pass,改成D->E->F,这说明,每次更新都是用已经确定了最短路径的元素来更新的,当前的F,其实已经被比了两次了!

我们发现,每次更新,都是以这个已经确定了最短路径的点来更新,更新完之后,再在U里挑一个最短的节点u加入S,为什么能确定此时u就是最短的,并且不会再更新呢?

  1. u 到起点的最短路径只能通过集合 S中的节点,因为在之前的步骤中,所有在 S 中的节点已经被处理过,它们的最短路径已经确定。
  2. 由于 u 是当前距离起点最近的未处理节点,意味着无论通过哪个已处理节点(属于 S),也不会有比当前路径更短的路径到达 u。因为都和F一样,被比过了。
  3. 如果有更短的路径到达 u,那么该路径一定经过一个还未处理的节点x(属于 U)。但是,这与选择 u 为当前最近的未处理节点相矛盾。因此,不可能存在这样一条更短的路径。(假如有x更短并且还在U中,我们就不会选u)

http://www.mrgr.cn/news/51570.html

相关文章:

  • 遥感图像处理又上大分!加个多模态,一篇A会到手~
  • 用Cursor开发了一个图片分割器
  • API项目:发布下线
  • 图论day62|拓扑排序理论基础、117.软件构建(卡码网)、最短路径之dijkstra理论基、47.参加科学大会(卡码网 第六期模拟笔试)
  • 在线培训知识库管理系统:教育行业的新动力
  • Qt | CMake(Qt5 VS Qt6)
  • 【计网】从零开始理解TCP协议 --- 熟悉TCP报头结构并理解三次握手与四次挥手
  • Java爬虫之使用Selenium WebDriver 爬取数据
  • c++实现跳表
  • CSMA/CD协议 监听算法
  • 在使用linux过程中找不到占据空间的大文件的解决方法
  • BUUCTF[GKCTF 2021]你知道apng吗
  • 养宠物的空气净化器有哪几款推荐?有没有性价比高的分享?
  • Docker--harbor私有仓库部署与管理
  • MybatisWebApp
  • 剖析线程池实现原理
  • k8s和ipvs、lvs、ipvsadm,iptables,底层梳理,具体是如何实现的
  • Blob详解
  • 【Python入门】提升 Python 水平的高级指南
  • Java传递对象是值传递还是引用传递?