弗洛伊德算法原理解释
不了解floyd算法是怎么一回事的可以先看下这篇文章,https://blog.csdn.net/yuewenyao/article/details/81021319是我见过讲得很清晰的了。
本文是对其原理的解释,希望看完此文后你能明白,“为什么floyd算法在插入N个顶点后一定会得到最短路径” ,以及,“乱序/任意顺序的插入所有顶点后都将得到最短路径”
要解释清楚这些,需要从最短路径的结果入手,可以认为floyd是从已知结果出发探寻出来的一种算法,以下是正文。
假设N个顶点之间的任意两点的最短路径已经确定,不妨认为,A1到Am两个点间的最短路径为A1->A2->…->Am-1->Am(其中m<n,A1点与Am点是任取的点)。
那么在这条最短路径上的任意两个点Ai与Aj之间的路径都将会是这两个点之间的最短路径,这个是好确定的:如果不是的话,把Ai与Aj之间的最短路径替换一下就会与上面的A1到Am的最短路径产生矛盾。
于是,当插入不属于这m个点的点时(即不是A1、A2、… 、Am之间的点),都不会影响到这些点之间的最短路径,那么我们可以不管非m个点之间的插入后的影响,同样的也不需要管A1和Am两个端点的影响,而只需要分析插入的是中间m-1个点(即A2、A3、… 、Am)时的结果。
为了让大家好理解一点,先插入A2试一下,那么A1->A3的距离,在经过A2后会达到最短(这是之前假设的结论),相当于一定会得到A1->A2->A3这样的一条A1到A3的最短路径。 同样的道理,如果我们插入中间的某个点Ai,就一定可以得到Ai-1->Ai->Ai+1这样的一条Ai-1到Ai+1的最短路径。于是,我们把中间的点全部插入后,这些最短路径就可以连起来从A1一直指向Am,这就与我们前面假设的最短路径一致了。
同时,基于上面的插入中间值的分析,显然我们任意顺序插入中间m-1个点最后都可以得到A1到Am的最短路径,故此,我们解释清楚了一开始的两个问题