码迷,mamicode.com
首页 > 编程语言 > 详细

图论中四个最短路径算法

时间:2018-05-14 21:39:12      阅读:212      评论:0      收藏:0      [点我收藏+]

标签: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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!