最短路径算法------------弗洛伊德最短路径

本篇主要是介绍弗洛伊德算法,也是当做一个笔记。

先举个例子:小明在暑期想要去其他城市旅游,他想去1,2,3,4四个城市。但是现在他想知道怎样走才是最划算的,也就是怎样走路程是最短的,类似于这样的图:

最短路径算法------------弗洛伊德最短路径_第1张图片

我们发现各个城市之间的路程都是有变化的,而且发现有的两个城市之间是没有直接回来的路的,那么这个时候就要通过其他城市进行中转了。但是不同的中转所走的路程又是不一样的,所以这个时候,如果小明会弗洛伊德算法的话,那么不就很容易知道怎样走了么?

接下来,我们就帮小明分析怎样走才是最划算的。

首先分析特例,比如说,从城市1到城市3有两种走法,第一种是从城市1直接到城市3,第二种是从城市1出发,经过城市2,然后再从城市2到城市3,发现这两种走法的路径长短是不一样的。我们发现第二种走法更加划算,那么我们肯定选择第二种方式了。再比如说,从城市4到城市3,第一种走法是直接从城市4走到 城市3,第二种走法是先从城市4走到城市2,然后经过城市2走到城市3,第三种,从城市4到城市2,然后经过城市2再走到城市1,最后再经过城市1走到城市3.我们发现第一种走法的权重是12,第二种走法的权重是11,第三种走法的权重是10,很显然,我们会选择第三种走法了。

好了,现在我们有了大致思路了,我们发现要想两个城市之间的距离变得更短,就要引入第三点,当然了,如果直接到达的距离更短,那么就不需要引入第三点了。

现在进行伪算法编写了,我们首先记录每两点之间的距离为权重,用v[i][j]表示,也就是代表从i城市到j城市之间的距离,假如我们要从城市4到城市3,中间经过1城市,那么他的大小就是v[i][1]+v[1][j],如果中间要经过1城市和2城市,那么大小就是v[i][2]+v[2][j],那么这个时候肯定有人有疑问了,要经过1跟2为什么是这样的,其实原理很简单,我们在从4 到 1 再到2 ,他们已经在v[i][2]或者v[2][j]中已经计算过了,而且其中的计算也是最短的,所以就是v[i][2]+v[2][j]这样了。

所以我们可以写出他的伪算法了:

for(int k=1;k<=n;k++)

for(int i=1;i<=n;i++)

for(int j=1;j<= n;k++)

if(v[i][k] > v[i][k]+v[k][j]){

v[i][k] = v[i][k]+v[k][j]

}

这也就是弗洛伊德算法的核心了,最重要的也就是这几句代码了。其实在深入理解,这里边也是一种递归算法,但是我们发现一点,这个算法的时间复杂度是O(n3),那么还有比这个时间复杂度更低的么?当然有了,让我们下次再见那么时间复杂度更低的最短路径算法。

你可能感兴趣的:(算法)