目录
一. 前言
二. Dijkstra算法
三. Floyd算法
一. 前言
所谓最短路径:就是在有向网当中,A点(源点)到达B点(终点)的多条路径中,寻找一条各边权值之和最小的路径,即最短路径。
如果是求解一个顶点到其他所有顶点的最短路径,就可以使用Dijkstra(迪杰斯特拉)算法。
如果是求解所有顶点间的最短路径就可以使用Floyd(弗洛伊德)算法。
二. Dijkstra算法
算法的操作原理如下所示:
总的来说,Dijkstra算法就是需要设置一个顶点集U,里面刚开始包括一个初始顶点,然后设置一个最短路径表,从这个初始顶点出发,如果是邻接的顶点那么此时的源点到这个顶点的最短路径就是它们边上的权值,否则权值都为无穷大。然后在这些最短路径中选择一条权值最短的,把对应的顶点加入到顶点集U中,接着更新最短路径表,看看因为加入了新的顶点作为中间顶点之后,最短路径有没有发生改变。
举个例子如下所示:
如上所示,有一个这样的有向网,将v0作为源点加入到顶点集U中,然后求它到其他顶点的最短路径,到v1为13,到v2为8,到v3为无穷大,到v4为30,到v5为无穷大,到v6为无穷大。由于这里面路径的权值最小的是到v2的路径,所以将v2加入顶点集U中,然后更新最短路径表如下所示:
因为加入v2之后,v0这个源点到v3的最短路径就不再是正无穷大了,而是可以通过v2到达,最短路径为13。其它的最短路径暂时还没改变。继续上面的操作,可以得到最终的结果如下所示:
已经加入到顶点集中的顶点,最短路径就不会发生改变了,因此就是一条长方形状的封条。
三. Floyd算法
该算法求解所有顶点到其它顶点的最短路径的操作步骤如下所示:
举个例子,有这样的有向网:
假设有向网中有n个顶点,那么它的最短路径表就是一个n*n的矩阵。例如这里有三个顶点,那么它的最短路径表第一行第一列就是从A到A,因此我们可以得到一个性质,那么就是该矩阵上对角线上的值都为0。初始时,从A到B的最短路径为4,从B到A的最短路径为6,其他顶点也是类似的求法,所以我们得到一个初始的所有顶点到其它顶点的最短路径表如下所示:
对应的顶点为:
其中AB也就是从A到B的最短路径,为4。
Floyd算法的核心就是增加中间顶点来试探,看有没有加入中间顶点后,顶点的最短路径发生改变。例如我们这里加入A,那么从C到B的最短路径就不再是正无穷大,而是可以通过A到达,也就变成了3+4=7.同理加入B和C的情况,如下所示:
最后使用Floyd算法的结果也就是当加入最后一个中间结点后的结果,这里总共有三个结点,所以加入C之后的最短路径矩阵也就是最后的结果。