「这是我参与11月更文挑战的第9天,活动详情查看:2021最后一次更文挑战」。
算法简介
算法是多源最短路径算法,即可以求任意两点的最短路径,它基于动态规划的思想,时间复杂度为。 它的创始人罗伯特·弗洛伊德将此算法命名为算法,简称算法。罗伯特·弗洛伊德是1978年图灵奖得主,他同时还创立了堆排序算法。
算法思想
算法的核心思想就是用每个点作为中间结点去更新任意点的最短路径。
它的核心思想是
其中也就是初值为邻接矩阵。
核心代码
假设目前存的是邻接矩阵。
void Floyd(){
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
map[k][i][j]=min(
map[k-1][i][j],
map[k-1][i][k]+map[k-1][k][j]
);
}
}
}
}
值得注意的是在最外层,这是因为本质是动态规划算法,做的实际上是二维动态规划。第一个维度的只表示第次动态规划的结果,而第二个第三个维度的则表示以第个点作为中间结点。
优化
算法可以在空间上进行优化,这才是平常使用的算法。 中,在第轮时,与相关的路径长度是不会改变的,所以无需保存前一个状态。
void Floyd(){
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
map[i][j]=min(
map[i][j],
map[i][k]+map[k][j]
);
}
}
}
}
总结
算法的因为要求任意两点最短路径,所以空间复杂度就是存图的,因为三重循环则导致了时间复杂度为。算法适用于带负权的图,但不能出现负权环。因此,算法不适用于大量数据的计算,他简单易实现的同时也注定了效率上得做取舍。