Floyd算法思想

算法描述:

(1) 用数组dis[i][j]来记录i,j之间的最短距离。初始化dis[i][j],若i=j则dis[i][j]=0,

若i,j之间有边连接则dis[i][j]的值为该边的权值,否则dis[i][j]的值为 。

(2) 对所有的k值从1到n,修正任意两点之间的最短距离,计算dis[i][k]+dis[k][j]的值,

若小于dis[i][j],则dis[i][j]= dis[i][k]+dis[k][j],否则dis[i][j]的值不变。

程序:

void Floyd(int dis[n+1][n+1],int path[n+1][n+1],int n)

{

int i,j,k;

for(k=1;k<=n;k++)

for(i=1;i<=n;i++)

for(j=1;j<=n;j++)

if(dis[i][k]+dis[k][j]

{

dis[i][j] = dis[i][k]+dis[k][j];

Path[i][j]=k;

}

}

正确性证明(归纳法) :

对于任意两点A,B:

(1)当从A到B之间的最短路径,在中间没有经过顶点或经过1个顶点号为1的顶点时,算法显然正确。

(2)假设A到B经过的最大顶点号不超过k-1时,算法得到的最短距离是正确的

(3)当A到B经过的最大顶点号为k时,则从A到顶点号为k的顶点v 之间的顶点号均不大于k-1,从v 到B之间的顶点号也不大于k-1,由假设2得,A到vk的距离是中间顶点号不超过k-1的最短距离,vk到B的距离是中间顶点号不超过k-1的最短距离,所以A经vk到B为A,B之间经过最大号为k的路径中距离最短的,由算法修正A,B的最短距离,即可得到A,B间顶点号不超过k的最短距离。

(4)综上所述,算法是正确的

时间复杂度:O(n3)