Skip to content

# 最短路径算法

求两个顶点之间的最短路径可以说是图最重要的应用之一。最短路径算法在自动寻路、路径规划等方面有广泛的应用。比如自动路由协议OSPF中就采用Dijkstra算法来进行路由的计算。

按计算的目的不同,我们可以把最短路径算法简单分为单源最短路径和多源最短路径。单源最短路径计算的是从某一个顶点(单源的由来)到所有其他顶点的最短路径。而多源最短路径可以一次算出所有顶点到其他顶点的额最短路径。

# 单源最短路径Dijkstra

实际上直接用BFS或者DFS都可以求单源最短路径,但他们最大的缺点是缺乏方向性,效率性不如下面要介绍的Dijkstra算法。

# 算法过程

Dijkstra是最为著名的单源最短路径,他的思想跟Prim算法很类似,都是不断选入顶点,最后扩展到所有的顶点。为此跟Prim算法类似,我们需要记录一个所有顶点与源顶点之间的最短距离数组(向量),随着顶点不断扩展,这个数组的值需要不断刷新。如果需要记录具体路径,还需要记录一个来源顶点的向量。

算法描述为:

我们看一个具体的例子:

如果要得到具体路径,可以从来源的数组里反推,例如要求到达5和6的最短路径:

# 算法特点和优化

Dijkstra算法有这么几个特点:

  1. 每回合选入一个顶点,选的是未选入顶点中与源顶点最近的顶点
  2. 只用选入的顶点更新,也就是说只需要更新与选入顶点相连的顶点
  3. 只更新未选入的顶点,已选入的顶点不需要重复更新
  4. 一旦某个顶点被选入,该顶点与源的最短路径就已经确定了,举例来说,上面如果只需要求到4的最短路径,那么第三轮4被选入时,就可以停机了。

Dijkstra算法的更新具有局部性,而且具有比较明显的方向性(都选距离最小的顶点)。相对于DFS和BFS,通常可以更快地到达要求的顶点并停机。而DFS和BFS,如果不将所有顶点都遍历完毕,是无法确定距离就是最短的(为什么?)。

Dijkstra算法每一回合都需要更新一下顶点的距离,这个复杂度是O(n) O(n),而整个过程要执行nn轮,所以复杂度是O(n2)O(n^2)

而且我们可以用类似Prim算法的优化手段来用堆优化他。跟Prim算法一样,我们每一回合要更新距离。对于这个被更新的距离,直接放入堆中即可。因为堆可以保证拿出的一定是最小的元素,这样我们取出来的一定是符合我们需要的元素。

需要注意的是,Dijkstra算法无法处理负权边。你可以想想为什么。

民权资讯网晚上经常梦遗怎么解决再生塑料网站设计秋景作文东海世家珠宝海马歌舞厅钢结构网站制作免费seo咨询赖字起什么名字好听柔佳今天生的女儿应该起什么名《闪闪的红星》 观后感虎年宝宝起名大全名字大全姓沈的男孩取名起名大全p2p网站营销推广渔具店铺起名短篇鬼故事民间万宁市委书记网店店铺名称怎么起好听头号玩家seo的广告属鸡起名禁忌那起名比较好产品网络营销如何推广姓王的女孩起名洋气姓氏谢起名字周易中seo优化推广学习费用是多少变身路人女主梦见鞋子破了周公解梦漆女孩起名少年生前被连续抽血16次?多部门介入两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”淀粉肠小王子日销售额涨超10倍高中生被打伤下体休学 邯郸通报单亲妈妈陷入热恋 14岁儿子报警何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言张家界的山上“长”满了韩国人?男孩8年未见母亲被告知被遗忘中国拥有亿元资产的家庭达13.3万户19岁小伙救下5人后溺亡 多方发声315晚会后胖东来又人满为患了张立群任西安交通大学校长“重生之我在北大当嫡校长”男子被猫抓伤后确诊“猫抓病”测试车高速逃费 小米:已补缴周杰伦一审败诉网易网友洛杉矶偶遇贾玲今日春分倪萍分享减重40斤方法七年后宇文玥被薅头发捞上岸许家印被限制高消费萧美琴窜访捷克 外交部回应联合利华开始重组专访95后高颜值猪保姆胖东来员工每周单休无小长假男子被流浪猫绊倒 投喂者赔24万小米汽车超级工厂正式揭幕黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发当地回应沈阳致3死车祸车主疑毒驾恒大被罚41.75亿到底怎么缴妈妈回应孩子在校撞护栏坠楼外国人感慨凌晨的中国很安全杨倩无缘巴黎奥运校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变王树国卸任西安交大校长 师生送别手机成瘾是影响睡眠质量重要因素国产伟哥去年销售近13亿阿根廷将发行1万与2万面值的纸币兔狲“狲大娘”因病死亡遭遇山火的松茸之乡“开封王婆”爆火:促成四五十对奥巴马现身唐宁街 黑色着装引猜测考生莫言也上北大硕士复试名单了德国打算提及普京时仅用姓名天水麻辣烫把捣辣椒大爷累坏了

民权资讯网 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化