弗洛伊德算法求解图中任意一对顶点之间的最短路径,其路径信息用二维数组path[ ][ ]存储,另外还需维护一个二位数组A(k)[ i ] [ j ]用来存储顶点i经由顶点k作为中间顶点到达顶点j的最短路径长度,当然如果以k作为中间顶点时路径较之前边长,则数组A中的路径长度仍不变,与其对应的path数组也不会将k存入对应位置。
#include<stdio.h> //弗洛伊德算法求解图中任意一对顶点之间的最短路径,其需要维护两个二维数组 A(k)[i][j]和path[i][j] //k表示从顶点i到顶点j的路径中加入顶点作为中间顶点,path[i][j]中存储从顶点i到顶点j要经过的中间顶点 void Floyd(Mgrap G,int path[][]) { int i,j,k,A[MAXSIZE][MAXSIZE]; //初始化数组A和path for(i = 0;i < G.vexnum;++i){ for(j = 0;j < G.vexnum;++j){ A[i][j] = G.edges[i][j]; path[i][j] = -1; //一开始没有中间顶点 故给值-1 } } //关键步骤三重循环 for(k = 0;k < G.vexnum;++k){ for(i = 0;i < G.vexnum; ++i){ for(j = 0;j < G.vexnum;++j){ if(A[i][j] < A[i][k] + A[k][j]){ A[i][j] = A[i][k] +A[k][j]; path[i][j] = k; } } } } }