虽然能用迪杰斯特拉算法求出图中某一个顶点到其余各个顶点的最短路径,但是如果求图中任意一对顶点间的最短路径,通常用弗洛伊德算法求解。
【弗洛伊德算法求解最短路径的一般过程】、
第一步,这是两个矩阵A和Path,初始时将图的邻接矩阵赋值给A,将矩阵Path中元素全部设置为-1。
第二步,以顶点k为中间顶点,k取0-n-1(n为图中顶点个数),对图中所有顶点对{i,j}进行如下检测与修改:
如果A[i][j] > A[i][k] + A[k][j],则将A[i][j]修改为A[i][k] + A[k][j]的值,将Path[i][j]的值改为k,否则什么都不做。
【弗洛伊德算法伪代码——参考自《数据结构高分笔记》】
public void Floyd(MGraph g,int A[][maxsize],int Path[][maxsize]){
for(int i=0;i<g.n;++i){ //这个双重循环实现对数组A和Path初始化赋值
for(int j=0;j<g.n;++j){
A[i][j] = g.edges[i][j];
Path[i][j] = -1;
}
}
for(int k=0;k<g.n;++k){ //这个三重循环完成了以k为中间点对所有的定点对<i,j>进行检测和修改
for(int i=0;i<g.n;++i){
for(int j=0;j<g.n;++j){ //循环以行优先遍历矩阵
if(A[i][j] > A[i][k]+A[k][j]){
A[i][j] = A[i][k]+A[k][j];
Path[i][j] = k;
}
}
}
}
}