1的传送门https://blog.csdn.net/qq_45839708/article/details/104361629
2.弗洛伊德(Floyd)算法
这个算法相对于迪杰斯特拉算法:
1. 代码简洁很多而且名字也好记些。
2. 可以直接得到所有点到所有点的最短路径。
3. 时间复杂度为 O(n^3) 数据量较少时而且题目要求求出任意两点最短路径,选择此算法更佳。
个人觉得弗洛伊德算法是借用中间点来求出最短路径
我们用下面的三角形进行说明:
不要被表面的等边三角形所迷惑,各点间都是有距离的。
E( V1, V2) = 1
E( V2, V3) = 3
E( V1, V3) = 5
代码实现:
void Floyd(MP[N][N], S[N][N], n)// MP:邻接矩阵,
{ // S:所有点到所有点的最短路径// n:顶点个数
int k, i, j;
for(i = 1; i <= n; i++)
for(j= 1; j <= n; j++)
S[i][j] = MP[i][j] // 初始化所有点到所有点的最短路径
for(k = 1; k <= n; k++)// 枚举所有点都作为中间点
{
for(i = 1; i <= n; i++)
{
for(j = 1; j <= n; j++)
{
S[i][j] = min(S[i][j], S[i][k] + S[k][j]);
}
}
}
}