佛洛依德算法:
利用D矩阵拿到邻接矩阵中的权值。path矩阵记录两点之间的移动中转点(初始值为起点)。
对于邻接矩阵中 i 到 j 点的权值进行比较,若加上一个中转点 k 后的权值小于原本的权值,则对D[i][j]改为较小的D[i][k] + D[k]+[j]
而更新之后,路径则是从i–j改为i–k--j,所以path[i][j] = path[k][j];
若要输出 i到 j的路径,要循环输出path对应位置的值.
注意,当路径变长时,path矩阵存储的值需要倒序输出才行,
举个例子:
有五个点abcde ,对应坐标分别为01234
其中顶点的连接关系为 a-b b-c c-d d-e a-e
由于三重循环先后顺序的缘故,path[0][4]的中转点为3
而path[0][3]的中转点为2
path[0][2]的中转点为1。。。直到最后为0本身
所以当顶点数量多时,个人认为需要倒序输出path中记录的路径信息
算法代码:
//图中任意结点间最短路径的算法(佛洛依德算法)
void Floyd(Graph g) {
int path[vexNum][vexNum]; //记录最短路径经过结点的信息
int D[vexNum][vexNum]; //记录最短路径的长度
for(int i=0;i<g.vexnum;i++)
for (int j =