一.算法介绍
Floyd算法是一种在有向图中求最短路径的算法。相比不能再有向图中包含负权值的dijkstra算法,Floyd算法可以用在拥有负权值的有向图中求解最短路径(不过不能包含负权回路)。它是一种求解有向图中点与点之间最短路径的算法。
我们检查有向图中的每一个节点X,对于图中过的2点A和B,如果有Dis(AX)+Dis(XB)<Dis(AB),那么使得Dis(AB)=Dis(AX)+Dis(XB)。当所有的节点X遍历完后,AB的最短路径就求出来了。
所以,核心代码很简单,其中N是顶点个数,时间复杂度为O(N^3)
其中要注意3个for循环的嵌套顺序
void floyd(int N)
{
int i,j,k;
for(k=0;k<N;k++)
{
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
if(Dis[i][k]+Dis[k][j]<Dis[i][j])
{
Dis[i][j]=Dis[i][k]+Dis[k][j];
}
}
}
}
}
二.算法的原理
Floyd算法原理是一种动态规划的思想。
设Ak(i,j)表示从i点到j点索引号不大于K的最短路径,
则求出最短路径,可表示为
for(K=0;K<N;K++)
然后依次求A0(i,j), A1(i,j), ..., An(i,j) ,其中A0(i,j)表示初始化时候的图
在这个过程中,我们要先求A0(i,j)才能求A1(i,j),再求A2(i,j).....所以这是一种自底向上的设计思想,为什么要先求A0(i,j)才能求A1(i,j),再求A2(i,j)呢.....
因为算法的运行过程是这样的。
我们可以由Ak(i,j)求出Ak-1(i,j),那么对于A