December 19, 2015 10:56 PM
Floyd算法是解决任意两点间的最短路径的一种算法,可以正确处理带权有向图或负权的最短路径问题
解决此问题有两种方法:
其一是分别以图中每个顶点为源点共调用n次算法;
其二是采用Floyd算法。
两种算法的时间复杂度均为O(n3),但后者形式上比较简单。
Floyd算法的基本思想:
1. 利用二维数组dist[i][j]记录当前vi到vj的最短路径长度,数组dist的初值等于图的带权邻接矩阵;
2. 集合S记录当前允许的中间顶点,初值S=Φ;
3. 依次向S中加入v0 ,v1… vn-1,每加入一个顶点,对dist[i][j]进行一次修正:设S={v0 ,v1… vk-1},加入vk,则dist(k)[i][j] = min{ dist(k-1)[i][j],dist(k-1)[i][k]+dist(k-1)[k][j]}。dist(k)[i][j]的含义:允许中间顶点的序号最大为k时从vi到vj的最短路径长度。
dist(n-1)[i][j]就是vi到vj的最短路径长度。
最短距离有三种情况:
1、两点的直达距离最短。
2、两点间只通过一个中间点而距离最短。
3、两点间用通过两各以上的顶点而距离最短。
对于第一种情况:
在初始化的时候就已经找出来了且以后也不会更改到。
对于第二种情况:
弗洛伊德算法的基本操作就是对于每一对顶点,遍历所有其它顶点,看