弗洛伊德算法:
Floyd也就是弗洛伊德算法,是图论中用来计算任意两点间最短路径的算法。
算法的过程是:
1.把图转换成一个带权重的n阶邻接矩阵。
2.依次把1-n的节点当作桥梁,也就是中间点,例如结点u,v和中间结点k,u和v在不经过k结点的时候存在最短 路径x,u经过k结点到达v的时候最短路径为y那么min{x,y}就是在增加k桥梁的时候u和v的最短路径。
Floyd算法执行过程:
例如对于以下的一个有向图,对应的临街矩阵的形式为:
邻接矩阵:
第一步:以定点0作为松弛的点,考虑a[i][j]表示定点i到顶点j经由顶点0的最短路径长度,经过比较,没有任何路径得到修改,因此有:
第二步:以定点1作为松弛的点,考虑a[i][j]表示定点i到顶点j经由顶点1的最短路径长度,经过比较,顶点0到顶点1由原来的没有路径变为0—1—2的路径,其长度为9;因此有:
第三步:以定点2作为松弛的点,考虑a[i][j]表示定点i到顶点j经由顶点2的最短路径长度,经过比较,顶点1到顶点0由原来的没有路径变为1—2—0的路径,其长度为7;
顶点3到顶点0由原来的没有路径变为3—2—0的路径,其长度为4
顶点3到顶点3由原来的没有路径变为3—2—1的路径,其长度为4因此有:
第四步:以定点3作为松弛的点,考虑a[i][j]表示定点i到顶点j经由顶点3的最短路径长度,经过比较,顶点0到顶点2由原来的路径长度为9,路径为 0—1—2,变为0—3—2,其长度为8;
顶点1到顶点0由原来的路径长度为7,路径为1—2—0,变为1—3—2—0,其长度为6;
顶点1到顶点2由原来的路径长度为4,路径为1—2 ,变为1—3—2 ,其长度为3;
如果设n为图中顶点的个数,则弗洛伊德的代码实现:
void floyd()
{
for(k=0;k<n;k++)
for(i=0;i<n;i++)