Floyd算法
求任意一对顶点之间的最短路径。 时间复杂度为O(n3)O(n^3)O(n3), 适
用于负边权的情况。
原理: 如果我们已经知道了图中任意两点间只允许以编号
≥\ge≥k-1的点作为中转时的最短路, 能不能以此推出任意两点
间只允许以编号<=k的点作为中转时的最短路呢?
if (d[i][k]+d[k][j]<d[i][j]) d[i][j]=d[i][k]
算法实现:
for (int k=1;k<=n;k++)
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
if (d[i][k]+d[k][j]<d[i][j])
d[i][j]=d[i][k]+d[k][j];
初始化条件:
d[ i ][ i ]=0; //自己到自己为0; 对角线为0;
d[ i ][ j ]=边权, i与j有直接相连的边
d[ i ][ j ]= +∞ , i与j无直接相连的边。
// 如果是int数组, 采用memset(d, 0x3f, sizeof d)可
全部初始化为一个很大的数