什么是单源最短路?
给定一个图和图中的一个点,求该点到其余各点的最短距离。Floyd算法思路:计算某点到其余各点的距离,可先求该点到其中一个点的距离,其他各点类似。假设求i点到j点的距离,跳点为空时,最短距离就是i到j的最短距离,跳点为1时,最短距离为D[i][j] = min{D[i][j],D[i][1]+D[1][j]},跳点为1和2时,最短距离为D[i][j]=min{D[i][j],D[i][2]+D[2][j]},依次类推。这里不用考虑为什么没有比较i->1->2->j这条路线,因为1为跳点时,已经将i从1到其他各点的距离都已经求出了,如果i->1->2这条路线的长度比i->2的路线长度小的话,D[i][2]就是对应的i->1->2这条路线的长度,i->2->j同i->1->2->j相比,2->j距离已定,i->1->2和i->2已经取了较小者,所以另一条一定比选取的距离大,不用再比较了。
- Floyd代码实现:
void GetShortestPath_Floyd(MGraph &G,DistanceMatrix &D)
{
//初始化D,根据图G,有路径的初始化为权值,没有的初始化为无穷大
for(int i = 1;i <= G.vexnum; ++i)
{
D[i][j] = G.arcs[i][j];
}
for(int k = 1;k <= G.vexnum; ++k)
{//第一层循环是可选择的跳点
for(int i = 1; i <= G.vexnum; ++i)
{//第二层循环是起点
for(int j = 1; j <= G.vexnum; ++j)
{//第三层循环是终点
D[i][j] = min(D[i][j],D[i][k] + D[k][j]);
}
}
}
}
- Floyd算法较简洁,易懂。但是用到了邻接矩阵而且有三层循环,对于空间复杂度和时间复杂度有一定的要求。
- Floyd算法也是一种动态规划,把问题分成几个阶段,一个阶段一个阶段的解决问题,最终的结果建立在这几个阶段的结果之上。