概念
最短路径也是图的一个应用,即寻找图中某两个顶点的最短路径长度。
实际应用:例如确定某两个城市间的坐火车最短行车路线长度等。
Floyd algorithm
中文名就是弗洛伊德算法。
算法思路:用邻接矩阵来存储图的结构,edge[i][j]表示从结点i到结点j的最短路径长度,那么该如何计算edge[i][j]呢?首先我们可以假设当前的edge[i][j]不是最短的路径长度,必须经过k结点,比较edge[i][i]与edge[i][k]+edge[k][j]的大小(其中k的取值为所有点的编号),如果前者小,则表明i到j的最短路径为当前的edge[i][j];如果后者小,那么就需要修改当前的edge[i][j],使得edge[i][i]=edge[i][k]+edge[k][j]。
ok,下面用代码表示一下:
for (int k = 1; k <= n; k++) { for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { if (edge[i][k] == MAX || edge[k][j] == MAX) continue; if (edge[i][j] == MAX || edge[i][k] + edge[k][j] < edge[i][j]) edge[i][j] = edge[i][k] + edge[k][j]; } } }
上面的三层循环就是Floyd算法的核心内容,其时间复杂度为O(n3)。
Floyd算法特点
1、时间复杂度按为O(n3),所以要求被求解的图的顶点个数不能大于200个,否则容易超时。
2、利用二维矩阵来进行存储图的结构,并进行相关计算。
3、算法结束后,图中所有结点之间的最短路径也被计算完成。可以查询到任意两点间的最短距离。
与迪杰斯特拉算法比较一下,前者主要是求图中某一顶点到其余各顶点的最短路径,后者主要是求图中任意两点间的最短路径。在实际应用中要学会灵活应用。
来源:https://www.cnblogs.com/tgycoder/p/5018620.html