最短路径搜索是基于Floyd算法的改进。
Floyd算法的基本思想
图1 选i到j的最短路径
Floyd算法的基本思想是:比较直接从i到j和从i经k到j的路径长度,选择较短的一条。当此条最短路径选定后,无论是i->j,或者是i->k->j都可以抽象成i->j,既都是以i为起点,j为终点的一条最短路径。
此时,考虑i,j,k,之外的另一节点n,要找i到n的最短路径。
图2
重复上述比较,我们显然可以找到一条i到n的最短路径。
继续添加节点,我们显然可以任意找到一张连通图中,任意两点的最短路径。
求路径原理及正确性
图3 从终点往回找最短路径直到终点
考虑如图3的一条最短路径。要想描述这条最短路径,我们只需要知道,每一个node的前驱节点是什么,从终点一直往回追寻,直到找到起点,输出路径。
于是,我们可以用一个二维矩阵roadMap来记录前驱节点。roadMap[i][j]是从起点i到终点j的最短路径中j的前驱节点。roadMap[i][j] == k 则说明,此条路径中j的前驱节点为k,从而转化为找i到k的最短路径,而roadMap[i][k]又是i到k最短路径中k的前驱节点。依次类推,一直往回找,知道roadMap[i][i]==i,便回溯到了起点i.
问题就转化为了求这样的roadMap矩阵。
因为Floyd算法是可以求出一张连通图的任意两个节点的最短路径长度,我们在每次比较时都记录,显然也可以求出任意两个节点最短路径的前驱节点。例如,如果是i->j更短,则j前驱节点为i。若i->k->j,更短,则j前驱节点为k.