个人笔记,仅供复习
1.适用范围:求每一对顶点之前的最短路径(适用稠密图)
2.算法思想:在一般情况下,若(vi,…,vk )和( vk,…,vj )分别是从 vi 到 vk 和从 vk 到 vj 的 中间顶点的序号不大于k的最短路径,则将( vi,…, vk ,… , vj )和已经得到的从vi到vj且中间顶点的序号不大于k-1的最短路径相比较,其长度较短者便是从vi到vj的中间顶点的序号不大于k的最短路径。这样,在经过n次比较后,最后求得的必是从vi到vj的最短路径。按此方法,可以同时求得各对顶点间的最短路径。
3.具体步奏:其中D(k)[i][j],表示只经过顶点编号小于k的顶点i与j的最短路径。
4.代码参考:
void Floyd()
{
for ( i = 0; i < N; i++ )
for( j = 0; j < N; j++ ) {
D[i][j] = G[i][j];
path[i][j] = -1;
}
for( k = 0; k < N; k++ )
for( i = 0; i < N; i++ )
for( j = 0; j < N; j++ )
if( D[i][k] + D[k][j] < D[i][j] ) {
D[i][j] = D[i][k] + D[k][j];
path[i][j] = k;
}
}