最短路径算法_LIN|图论1:Dijkstra算法,最短路径

从前有那么一个地方,它先后被条顿骑士团国、普鲁士公国和东普鲁士定为首都或首府,第二次世界大战期间成为苏联领土。就在这片土地上埋葬着一名叫莱昂哈德·欧拉的瑞士人。说起欧拉,大家肯定都耳熟能详。他不仅是以自己的名字命名了最美公式,也是入乡随俗解决了当地居民提出的一个问题:

一个步行者怎样才能不重复、不遗漏地一次走完七座桥,最后回到出发点。

说到这里大家一定都很清楚了那是哥尼斯堡七桥问

578d6bd0a07a6b3084c7ffa1f5f78414.png

要使得一个图形可以一笔画,必须满足如下两个条件:

1. 图形必须是连通的。

2. 图中的“奇点”个数是0或2

QwQ 详见人教版小学数学第十二册书104页 或人教版初中第一册121页。

当然有了欧拉的一笔画问题即每边只经过一次,紧接着的就是哈密尔顿周游世界问题即每个顶点只经过一次。

要判定一个图是否具有哈密顿圈的问题,是图论中著名的难题之一。除个别情形以外,迄今为止还没有找到一个图是否具有哈密顿圈的必要而且充分的条件。

哈密顿圈问题引出了诸如货郎问题、邮递员问题等类似的问题。比如,货郎问题就是货郎必须到每个村庄售货,怎样走才能使路程最短?当然,这个问题因为还要求“路程最短”,比哈密顿圈问题难度更大,以致用现代电子计算机来解决都很复杂。


然后就是伴随着我们成长的最短路径的问题了

初中时老师就讲过了对称和找轨迹的方法求最短距离,但出题者完全不被限制在者范围内

于是就会有人遇到类似一下列出的几个问题:

求赋权图中定点到其余点的最短路径


进阶版:请找出赋权图中到取余各点距离之最短的顶点

由于计算量过于庞大

人们通常用计算机解决上述两类问题,具体应用算法为

(标号法)

8cf5e6aadf48234501eb81b11d396a20.png

小编在此感叹多看看大神预防早恋

算法定义

“迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是从起始点开始,采用贪心算法的策略,每次遍历到始点距离最近且未访问过的顶点的邻接节点,直到扩展到终点为止。”

摘自百度百科

算法运行原理

  1. 在算法运行时需指定点u0为起始点

  2. 引入几何S和U,两个几何都包含各店名称和他们到起始点的距离

  3. 初始时S只包括起始点,U包括其余点(对应距离为∞),更新U中与起始点直接相连的点的距离,选择最小的加入S(该点成为u1),通过u1更新U中的点,选择U中最小的点加入S…如此循环直至每个点都加入S,U为空集


算法运行实例

求点u0到其余点的最小距离

0cc4608c79d57c4ee69d5c774b57e948.png

0fc740542b01c54b68e99dfe32ab005c.png

dd78555a32be0d98fb18216998fee0b1.png

初始化,S={u0},dis[v1]代表v0到v1点的最短距离, dis[v1 ]=2,dis[v3 ]=7,dis[v4 ]=4,其余为无穷大,即U={v1(2),v3(7),v4(4),v2=∞,v5=∞}

64fb98a6d4c592066ee0ffa393bfca08.png 

集合U中v1最小,更新S={u0 (0),u1 (2)}, 与v1直接相连的点有v0,v4,v5,v2其中v0在U中则不考虑,通过v1更新,dis[v4 ]=3,小于原U集合中记录的距离则替换掉,dis[v5 ]=7,dis[v2 ]=7, 即U={v3(7),v4(3),v2(7),v5(7)}

 439ef28ba395b5b561a9e77f533f6ed0.png

集合U中v4最小,更新S={u0 (0),u1 (2),u2 (3)},通过v4更新, dis[v3 ]=7,与原集合U中对应距离相等,dis[v5 ]=4< 7,替换,即U={v3(7),v2(7),v5(4)}

 c28d29d183a4bcbb9fbefcb9989654c0.png

集合U中v5最小,更新S={u0 (0),u1 (2),u2 (3),u3 (4)},通过v5更新,dis[v2 ]=12>7,即即U={v3 (7),v2 (7)}

c72c9462128b4e0cae5affe22ccd3c76.png 

集合U中v3 (7),v2 (7)最小,U中没有剩余点可以更新,即S={u0 (0),

u1 (2),u2 (3),u3 (4),u4 (7),u5 (7)}

∴结果S={u0 (0),u1 (2),u2(3),u3(4),u4 (7),u5 (7)}


- End -

?

ab5c982765f02c74ebfd95a0e6d5ba7d.png

点击上方蓝字关注我们

ba09471e6c35f7b4486adbf8462b704b.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值