Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低。
Dijkstra算法是很有代表性的最短路算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。
其基本思想是,设...
分类:
编程语言 时间:
2015-02-16 14:21:14
阅读次数:
299
Bellman-Ford 算法是一种用于计算带权有向图中单源最短路径的算法。该算法由 Richard Bellman 和 Lester Ford 分别发表于 1958 年和 1956 年。Bellman-Ford 算法和 Dijkstra 算法同为解决单源最短路径的算法。对于带权有向图 G = (V...
分类:
编程语言 时间:
2015-01-31 10:42:18
阅读次数:
467
Dijkstra 算法又称为单源最短路径算法,由计算机科学家 Edsger Dijkstra 于 1956 年构思并于 1959 年发表。其解决的问题是:给定图 G 和源顶点 v,找到从 v 至图中所有顶点的最短路径。Dijkstra 算法的初始实现版本并未使用最小优先队列实现,其时间复杂度为 O(...
分类:
编程语言 时间:
2015-01-31 10:39:05
阅读次数:
328
对于全源最短路径问题(All-Pairs Shortest Paths Problem),可以认为是单源最短路径问题的推广,即分别以每个顶点作为源顶点并求其至其它顶点的最短距离。Johnson 算法描述如下:给定图 G = (V, E),增加一个新的顶点 s,使 s 指向图 G 中的所有顶点都建立连...
分类:
编程语言 时间:
2015-01-31 10:33:14
阅读次数:
329
优点:代码较少,复杂度不高,可以判断是否会有负环。
缺点:效率低。
算法阐述:
这个算法的思想非常简单,首先它是根据从起点向与它相连的线段开始刷新,只要满足刷新后的路径比原有路径小的话,那么就立即更新这个数据,是这个数据作为新的数
据。同时这个算法有一个很重要的优势,那就是可以判断有没有负环的存在。
负环判断原理:
这个算法的代码我在下面会有一个代码的描述,这个算法是通过一个整...
分类:
编程语言 时间:
2015-01-24 13:12:27
阅读次数:
196
在《【Java】线程并发、互斥与同步》(点击打开链接)中利用了操作系统通过操作信号量控制的原始方法,完成了线程的互斥与同步,说句题外话,其实这个信号量的算法,是著名的迪杰斯特拉创造的,也就是数据结构、计算机网络上面最短路径算法、迪杰斯特拉算法、Dijkstra算法的贡献人。其实Java里面根本就不需要自己定义一个信号量来实现临界区,Java对于临界区的实现早已封装好了,而且synchronized...
分类:
编程语言 时间:
2015-01-20 22:23:06
阅读次数:
2185
最短路径算法:Dijkstra算法和Floyd算法图论走一步:由起点StartNode A遍历一条边,选择最短的一条边链接到节点B,记距离dAB。走两步:由B遍历相连的边,选择最短的一条边,记临时距离dtemp,此时距离dAB+dtemp;和A走一步第二短距离比较,短的距离作为走两步的距离。基本就是...
分类:
编程语言 时间:
2015-01-18 18:34:48
阅读次数:
180
Dijkstra算法和BellmanFord算法是两大经典的单源最短路径算法. Bellman支持负权重的边, 不支持负环. Dijkstra算法的效率更高, 不支持负边, 用处更广泛.Dijkstra的基本过程如下:初始化每一个节点: 对于源节点, 我们把距离(distance)字段设为0. 其他...
分类:
编程语言 时间:
2015-01-14 21:15:28
阅读次数:
282
问题描述
单源最短路径问题,即在图中求出给定顶点到其它任一顶点的最短路径。
最短路径的最优子结构性质
该性质描述为:如果P(i,j)={Vi....Vk..Vs...Vj}是从顶点i到j的最短路径,k和s是这条路径上的一个中间顶点,那么P(k,s)必定是从k到s的最短路径。下面证明该性质的正确性。
性质证明:用反证法易证。
Dijkstra算法实现
ps:用连接矩阵i...
分类:
编程语言 时间:
2015-01-13 19:55:16
阅读次数:
194
问题:有代价的单源最短路径,并要求存储路径。(求最短的路径,并使代价最小)特点:* 存储路径:决定了难以用dijkstra,可以用flody,用path[i][j]表示 i 想走到 j 迈出的第一步。假设k是 i->j 的中间节点,更新时候用path[i][j] = path[i][k],具体做法见link。但是flody比较耗时(O(N^3))* 有代价:如果想用flody的话,有要求代价最小,...
分类:
其他好文 时间:
2015-01-09 14:20:51
阅读次数:
191