//一个有权图的邻接矩阵经过弗洛伊德算法处理后,得到的结果,能够解决求任意两顶点的最小路径问题和最小
//权值问题。具体处理得到的结果是一个记录最小权值的二维数组A[i][j](表示顶点i到顶点j的最小权值)
//和记录前驱顶点的二维数组Path[i][j](表示i到j的最短路径中j的前驱结点,如是k,则再查
//Path[i][k],如此可逆序输出i到j的最短路径);具体处理步骤看代码
void Floyd(MGraph G,int Path[][]){
int i,j,k;
int A[MaxSize][MaxSize];
for(i=0;i<G.vexnums;i++){//对数组A[i][j]和Path[i][j]进行初始化
for(j=0;j<G.vexnums;j++){
A[i][j]=G.Edges[i][j];
Path[i][j]=-1;//若处理后仍为-1,则表示i到j直达即为最短路径
}
}
for(k=0;k<G.vexnums;k++){//该循环为比较i到j的路径是否比i到k再到j的路径要长,如果是,则更
//新为较小值,并且记录k表示路径经过顶点k,*但最后结果不一定经过顶点k,这只是目前遍历中的最优解,
//比如,2->0->1比2->1权值小,但比2->3->1权值大,由于遍历时先遍历的k0,所以此时的k0不在2->1
//的最终优解中,这也是这个循环不会因为遍历的顺序而错过最优解的关键*
for(i=0;i<G.vexnums;i++){
for(j=0;j<G.vexnums;j++){
if(A[i][j]>A[i][k]+A[k][j])[
A[i][j]=A[i][k]+A[k][j];
Path[i][j]=k;
}
}
}
}
}
时间复杂度为O(n^3)。