Floyd算法(所有点对最短路径)就是每对可以联通的顶点之间总存在一个借助于其他顶点作为媒介而达到路径最短的最短路径值(这个值通过不断增添的媒介顶点而得到更新,也可能不更新——通过媒介的路径并不比其原路径更短),所有的值存储于邻接矩阵中。
典型的动归思想。
值得注意的是,Floyd算法本次的状态的获取只用到了上个阶段的状态,而没有用到其他阶段的状态,这就为压缩空间奠定了条件。
Floyd算法能够成功的关键之一就是D0(初始矩阵,即权重矩阵)的初始化,凡是不相连接的边必须其dij必须等于正无穷且dii=0(矩阵对角线上的元素!)
代码如下:
/*path[i][j]=k,说明 j 的前驱是 k */
void PrintShortestPath (int ** path , int i , int j )
{
static int flag1 = 0 ;
static int flag2 = 0 ; //flag1和flag2是一次性买卖
if (flag1 == 0 ) //首尾要单独输出,要不然输出的结点会重复
{
cout << "The shortest path from v" << i + 1 << " to v" << j + 1 << " is: /n " ;
cout << "v" << i +