关于Dijkstra算法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于Dijkstra算法相关的知识,希望对你有一定的参考价值。

Dijkstra算法是解单源最短路径问题的一个贪心算法。
其基本思想是,设置一个基点集合 S ,并不断地作贪心
选择来扩充这个集合。
一个项点属于集合 S 当且仅当从源到该项点的最短路
径长度已知。
初始时,S中仅含有源。设 u 是 G 的某一个项点,
我们把从源到 u 且中间只有经过 S 中项点的路称为
从源到 u 的特殊路径,并且数组 dist 来记录当前每个
项点所对应的最短特殊路径长度。
Dijkstra算法每次从 V-S 中取出具有最短特殊路径长度
的项点 u ,将 u 添加到 S 中,同时对数组 dist 作必要
的修改。

什么意思???

楼上正解,你找个图自己用此算法实践一下就知道了,从A点出发,发现离A最近的点是B点,那么我们就已经认为A到B的最短距离就是AB了,如果有负数,就指不定冒出个C点,AC+CB<AB;或者冒出个DE为很大的负值,AC+CD+DE+EF+FB<AB;等等诸如此类的情况。
简单说来,你驾车从家出发到某地沿某条路只需经过一个收费站,但是远在外省某地有个站不但不收你的费,你去了还会给你个千八百万的欢迎光临费,你能说你直接沿着这条路去某地是最省费用的?不计时间成本,绕到外省那个给你钱的地方,再绕回到你的目的地,还能赚钱呢。
而且一般权值为负的图研究也比较少。有些带负权的图,某些点间还没有最小距离呢。中间出个带某条负权很大的边的环圈,绕此一圈所经过的距离反而减少了,那就一直在此圈上绕啊绕啊绕到负的足够大溢出为止。
当然考虑各种自己随便假设出来的变种问题也是很有趣的。比如说边带有多个权值对应多次经过改变的消费,上面的问题有可能变成有解的。话说那个站会后悔,第二次经过它会收回100万,第三次经过收回250万,这样的话你只需要经过一次就够了,问题也是有解的。再比如说对于多权重图,从A点出发经过B点到达C点的最短路线,就不是简单的AB最短路线+BC最短路线了,说不定两者有重合边,第二次经过来个天价就傻眼了。其实这种图貌似应该可以转化成单权重图的,我直觉估计啊,刚随便想出这个问题,还没去思考这个问题的解^_^
参考技术A 也就是说,假设当前步骤,算法从V-S中取出了具有最短特殊路径长度的顶点u,那么因为u是最短的,所以他到源的最短路径长度就是dist(u)本身,然后将u加入到S集合中去,由于集合S多了一个元素,所以有必要将dist数组进行更新,抛开采用的数据结构的问题,通常都是扫描每个节点v,如果 dist(u)+dis(u,v)<dist(v) 也就是说先经过u然后再到v比直接到v来的近的话,就将dist(v)改为dist(u)+dis(u,v)

最后当所有顶点都在S中时,所有顶点的最短路径都已求到,就是dist本回答被提问者采纳

以上是关于关于Dijkstra算法的主要内容,如果未能解决你的问题,请参考以下文章

算法描述》关于SPFA和Dijkstra算法的两三事

(总结) 关于Dijkstra的一些看法

关于dijkstra算法的一点理解

图论——关于Dijkstra的贪心思想

Dijkstra 开发了哪些算法?

Dijkstra算法 小白说明