自己画图真的是一件很累的事情,麻烦大家互相学习引用的同时注明出处,互相学习,不胜感激。
一、最短图路径算法
1、Dijkstra Algorithm
- 是一个贪心算法
解决的是带权重的有向图上单源最短路径问题,并且所有权值非负 - 基本思想:从源点出发,每次选择离源点最近的一个顶点前进,然后以该顶点为中心进行扩展,最终得到源点到其余所有点的最短路径
2、Floyd-Warshall Algorithm:动态规划算法
- 任意两点之间的最短路径,这称为多源最短路径问题
二、Pseudocode
DIJKSTRA(G,w,s)
1. INITIALIZE_SINGLE_SOURCE(G,s)
2. S=∅
3. Q=G.V
4. while Q≠∅
5. u=EXTRACT_MIN(Q)
6. S=S∪{u}
7. for each vertex v∈G.Adj[u]
8. RELAX(u,v,w)
S:已访问过节点集合
Q:保存节点集合(最小优先队列)
u:最小的节点
RELAX(u,v,w):松弛操作
三、推导
- 简要分为8步,来进行分析和推导
1、初始化
2、找到第一个点A,遍历他,此时,由于A和其他点之间的距离位置,均初始化为∞
3、第一个点A已访问完成,找到他可到达的节点为B和C,此时,B和C节点的具体分别为6和3,均比∞小,故修改到A的最短距离。
4、由于和A相连的点有B和C,此时,按照伪代码第5步来说,需要找到最小的点,接着遍历,故开始遍历C点。与C点相连的点有B、D、E,故此时基于已有的A-C的距离为3的基础,开始计算距离,分别为5、6、7
5、同理可得,取最小的点,开始遍历B,计算与其相关的点的距离。
6、遍历D
7、遍历E
8、至此,到了F点后,所有的点遍历完成。路径如下表所示,一目了然。
四:总结
- 时间复杂度:
设图的边数为E,顶点数为V
-
依赖于最小优先队列的实现数据结构
通过节点1~|V|数组,第V个的值存在第V个位置 :O( V^{2} + E) =O(V^{2})
使用斐波那契堆 O(Vlg{V} + E) = O( Vlg{V} ) -
缺陷:当所搜索的图存在非负值时,
导致u—>v之间存在一条负权回路
[参考资料]
算法导论第三版
写在最后
打个小广告:希望大家关注三个程序猿的成长史
微信号:Technology Army