当前位置: 代码迷 >> 综合 >> 最短路径(Floyd)
  详细解决方案

最短路径(Floyd)

热度:24   发布时间:2023-11-27 05:56:56.0

给定带权有向图 G=(V, E),  对任意顶点vi,vj 属于V,(i!=j) 求顶点vi到顶点vj的最短路径

解决办法: 弗洛伊德提出的求各个顶点之间的最短路径算法-----Floyd算法

基本思想:(利用循环,依次把0,1,2,......n顶点添加到路径上看路径权值矩阵是否发生变化)                      

路径矩阵表示的是任意两个顶点之间的权值

1.用图中的权值去初始化A[][]数组,  将path[][]全部初始化为-1;

首先对于n个顶点的图G,求任意一对顶点 Vi --> Vj之间的最短路径,可以分为下面几个阶段。

# 初始:不允许在其他顶点中转,最短路径是??                                                                        (最短路径就是图中权值组成的n*n的矩阵,  n代表顶点个数)

#0: 若允许V0中转, 最短路径是?

#1:若允许V0,V1中转,最短路径是?           ...........

#n-1: 若允许V0, V1,V2,........V(n-1)中转,最短路径是

例如, 图结构为:

 初始化A[][]数组 和 path[][] 数组.

首先需要一个A[]矩阵和path[]矩阵;有n个顶点,所以需要循环n趟。
for(int k=0; k<n; k++){     //有n个顶点,用来表示将n个顶点一次加入for(int i=0; i<n; i++){         for(int j=0; j<n; j++){          //这两层循环用来看A[][]数组和path[]数组//如果加入k顶点后,i到k到j的权值 小于 i到j的权值,则需要更新A[][]数组和path[][]数组if(A[i][j]>A[i][k]+A[k][j]){  A[i][j]=A[i][k] + A[k][j];path[i][j]=k; }	}}
}