思想:广度优先算法、贪心算法
时间复杂度:是O(n2)

算法思想

算法图解


动态规划的思想
时间复杂度为:O(n3)
-
算法的特点:
弗洛伊德算法是解决任意两点间的最短路径的一种算法,可以正确处理有向图或有向图或负权(但不可存在负权回路)的最短路径问题,同时也被用于计算有向图的传递闭包。
-
算法的思路
通过Floyd计算图G=(V,E)中各个顶点的最短路径时,需要引入两个矩阵,矩阵S中的元素a[i][j]表示顶点i(第i个顶点)到顶点j(第j个顶点)的距离。矩阵P中的元素b[i][j],表示顶点i到顶点j经过了b[i][j]记录的值所表示的顶点。
假设图G中顶点个数为N,则需要对矩阵D和矩阵P进行N次更新。
- 初始时,矩阵D中顶点a[i][j]的距离为顶点i到顶点j的权值;如果i和j不相邻,则a[i][j]=∞,矩阵P的值为顶点b[i][j]的j的值。
- 接下来开始,对矩阵D进行N次更新。第1次更新时,如果”a[i][j]的距离” > “a[i][0]+a[0][j]”(a[i][0]+a[0][j]表示”i与j之间经过第1个顶点的距离”),则更新a[i][j]为”a[i][0]+a[0][j]”,更新b[i][j]=b[i][0]。
- 同理,第k次更新时,如果”a[i][j]的距离” > “a[i][k−1]+a[k−1][j]”,则更新a[i][j]为”a[i][k−1]+a[k−1][j]”,b[i][j]=b[i][k−1]。更新N次之后,操作完成!

例子:





含负权边的带权有向图的单源最短路问题。不能处理带负权边的无向图
-
为什么Dijkstra算法权重不能是负值举例

- 此时,0 —>2的最小距离应为2



Bellman-Ford算法的流程如下:
-
给定图G(V,E)(其中V、E分别为图G的顶点集与边集),源点s,数组Distant[i]记录从源点s到顶点i的路径长度,初始化数组Distant[n]为,Distant[s]为0;
-
以下操作循环执行至多n−1次,n为顶点数:
-
对于每一条边e(u,v),如果Distant[u]+w(u,v)<Distant[v],则另Distant[v]=Distant[u]+w(u,v)。w(u,v)为边e(u,v)的权值;
-
若上述操作没有对Distant进行更新,说明最短路径已经查找完毕,或者部分点不可达,跳出循环。否则执行下次循环;
-
为了检测图中是否存在负环路,即权值之和小于0的环路。对于每一条边e(u,v),如果存在Distant[u]+w(u,v)<Distant[v]的边,则图中存在负环路,即是说该图无法求出单源最短路径。否则数组Distant[n]中记录的就是源点s到各顶点的最短路径长度。
可知,Bellman−Ford算法寻找单源最短路径的时间复杂度为O(V∗E).









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