需要两个矩阵
D矩阵保存距离,D[i][j] 存储的就是 i 到 j 点的距离;
Path矩阵保存路径;
Floyd 算法不能解决有负值圈的情况;
void Floyd(Graph G,int D[][Maxnum],int Path[][Maxnum])
{
int i, j, k;
for (i = 0; i < G->Nv; i++)
for (j = 0; j < G->Nv; j++)
{
D[i][j] = G->G[i][j]; // copy 保存图的矩阵,如果 i 到 j 没有边,G[i][j] 值为无穷大
Path[i][j] = -1;
}
for (k = 0; k < G->Nv; k++)
for (i = 0; i < G->Nv; i++)
for (j = 0; j < G->Nv; j++)
if (D[i][j] < D[i][k] + D[k][j])
// 如果 i 到中间节点 k 的距离加上 k到 j 的距离小于 i 到 j 的距离
// 更新距离和路径 , 经过 k 个节点 的 递推,i 到 j 的距离必为最小值
{
D[i][j] = D[i][k] + D[k][j];
Path[i][j] = k;
}
}