1、Dijkstra算法

思想:广度优先算法、贪心算法
时间复杂度:是O(n2)O(n^2)
2、最短路径算法
算法思想
2、最短路径算法
算法图解
2、最短路径算法
2、最短路径算法

2、Floyd算法

动态规划的思想
时间复杂度为O(n3)O(n^3)

  • 算法的特点:
    弗洛伊德算法是解决任意两点间的最短路径的一种算法,可以正确处理有向图或有向图或负权(但不可存在负权回路)的最短路径问题,同时也被用于计算有向图的传递闭包。

  • 算法的思路
    通过FloydFloyd计算图G=(V,E)G=(V,E)中各个顶点的最短路径时,需要引入两个矩阵,矩阵SS中的元素a[i][j]a[i][j]表示顶点ii(第ii个顶点)到顶点jj(第jj个顶点)的距离。矩阵PP中的元素b[i][j]b[i][j],表示顶点ii到顶点jj经过了b[i][j]b[i][j]记录的值所表示的顶点。

假设图GG中顶点个数为NN,则需要对矩阵DD和矩阵PP进行NN次更新。

  • 初始时,矩阵DD中顶点a[i][j]a[i][j]的距离为顶点ii到顶点jj的权值;如果iijj不相邻,则a[i][j]=a[i][j]=∞,矩阵PP的值为顶点b[i][j]b[i][j]的j的值。
  • 接下来开始,对矩阵DD进行NN次更新。第11次更新时,如果”a[i][j]a[i][j]的距离” >>a[i][0]+a[0][j](a[i][0]+a[0][j]a[i][0]+a[0][j]”(a[i][0]+a[0][j]表示”iijj之间经过第11个顶点的距离”),则更新a[i][j]a[i][j]为”a[i][0]+a[0][j]a[i][0]+a[0][j]”,更新b[i][j]=b[i][0]b[i][j]=b[i][0]
  • 同理,第kk次更新时,如果”a[i][j]a[i][j]的距离” >>a[i][k1]+a[k1][j]a[i][k-1]+a[k-1][j]”,则更新a[i][j]a[i][j]为”a[i][k1]+a[k1][j],b[i][j]=b[i][k1]a[i][k-1]+a[k-1][j]”,b[i][j]=b[i][k-1]。更新NN次之后,操作完成!

2、最短路径算法
例子:
2、最短路径算法
2、最短路径算法
2、最短路径算法
2、最短路径算法
2、最短路径算法

3、Bellman-Ford算法

含负权边的带权有向图的单源最短路问题。不能处理带负权边的无向图

  • 为什么Dijkstra算法权重不能是负值举例
  • 2、最短路径算法
  • 此时,0 >20 \ —> 2的最小距离应为22

2、最短路径算法
2、最短路径算法

2、最短路径算法
Bellman-Ford算法的流程如下:

  • 给定图G(V,E)G(V,E)(其中VEV、E分别为图GG的顶点集与边集),源点ss,数组Distant[i]Distant[i]记录从源点ss到顶点ii的路径长度,初始化数组Distant[n]Distant[n]为,Distant[s]Distant[s]00

  • 以下操作循环执行至多n1n-1次,nn为顶点数:

  • 对于每一条边e(u,v)e(u,v),如果Distant[u]+w(u,v)<Distant[v]Distant[u]+w(u,v)<Distant[v],则另Distant[v]=Distant[u]+w(u,v)Distant[v]=Distant[u]+w(u,v)w(u,v)w(u,v)为边e(u,v)e(u,v)的权值;

  • 若上述操作没有对DistantDistant进行更新,说明最短路径已经查找完毕,或者部分点不可达,跳出循环。否则执行下次循环;

  • 为了检测图中是否存在负环路,即权值之和小于00的环路。对于每一条边e(u,v)e(u,v),如果存在Distant[u]+w(u,v)<Distant[v]Distant[u]+w(u,v)<Distant[v]的边,则图中存在负环路,即是说该图无法求出单源最短路径。否则数组Distant[n]Distant[n]中记录的就是源点ss到各顶点的最短路径长度。

可知,BellmanFordBellman-Ford算法寻找单源最短路径的时间复杂度为O(VE)O(V*E).
2、最短路径算法
2、最短路径算法
2、最短路径算法
2、最短路径算法
2、最短路径算法
2、最短路径算法
2、最短路径算法
2、最短路径算法
2、最短路径算法

http://courses.csail.mit.edu/6.006/spring11/lectures/lec15.pdf

相关文章: