标签:ase 开始 最小 最短路径 min 利用 大于 路径 a算法
(一)单源最短路径算法
1. Dijksta算法
要求图G(V,E)的所有边的权重都为非负值。
运用了贪心算法的思想,但是较好地的是,其找到的解一定是最优解。
算法主要思想:
用数组d[]表示开始节点A到其余节点的路径长度;用w(u,v)表示节点u到v的权值,若两节点无直接路径,则该值为无穷大;矩阵Q保存每次循环每个节点的dv]值,总结点数为n。
初始时,开始节点到自身距离d[A]初值为0,到其余节点d[V]初值为无穷大。
循环:对每个节点进行判断,若d[v]大于d[u]+w(u,v),则令d[v]=d[u]+w(u,v),即进行一次松弛操作。一次操作后,选取本次循环中d[i]最小的节点i为下次循环的节点u,这也是贪心的思想所在,即每次循环选取路径最短的节点为中间节点。
上述进行循环n-1次。
则d[v]为从初始节点到节点v的最短路径。
时间复杂度:O(V.Texteact-min+E.Tdecrease-key)。
2. Bellman-Ford算法
图G(V,E)中的边的权重可以为负值。
思想:
在上述Dijkstra算法的思想上,增加了一个判断是否有负环路的操作,如果有负环路,则表示该图中不存在从初始节点到目标节点的最短路径。
判断是否存在负环路:松弛操作进行完后,判断若d[v]>d[u]+w(u,v),则表示有负环路,报告错误。
时间复杂度:O(VE)。
(二)全源最短路径算法
3. Floyd-Warshall算法
要求图G(V,E)的所有边的权重都为非负值。
思想:
用Ck(i,j)表示第k次循环后的矩阵C(i,j),k从1到n。
该算法的框架为三层循环,最外层为循环次数,即一共生成n个矩阵C(,),里面两层循环即n=k时对C(,)进行遍历填写。
C(i,j)表的填写为松弛操作:若C(i,j)>C(i,k)+C(k,j),则C(i,j)=C(i,k)+C(k,j)。
时间复杂度:O(n^3)。
4. Johnson算法
图G(V,E)中的边的权重可以为负值。
思想:
对权重重新赋值,使其新的权重不小于0,且保持各该图的最小路径关系,再利用Bellman-ford算法进行计算。
时间复杂度:O(VE+V^2LGV)。
匆忙写的,难免有错误的地方,要是发现了欢迎指正。
标签:ase 开始 最小 最短路径 min 利用 大于 路径 a算法
原文地址:https://www.cnblogs.com/yuyu-blog/p/9022163.html