浅议Floyd算法
Floyd算法:
Dk[i][j]=路径{i->{l<=k}->j}的最小长度,只经过编号小于等于k的顶点,一步一步的生成。
D0,D1.....Dv[i][j]即给出了i到j的真正最短距离。
最初的D-1是是一个对角元是0,如果两个元素联通,矩阵的值是图的权重,其他没有相连的正无穷。
Dk-1已经完成,递推到Dk时:
k不属于最短路径,Dk=Dk-1;
k属于最短路径时,Dk[i][j]=Dk-1[i][k]+Dk-1[k][j];
实际上,这是一个动态规划算法。
void Folyd()
{
memset(D,INF,sizeof(D));
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
D[i][j]=G[i][j];
}
for(int i=0;i<n;i++)
D[i][i]=0;
for(int k=0;k<n;k++)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
D[i][j]=min(D[i][j],D[i][k]+D[k][j]);
}
}
}
慢慢理解吧