所有点对间最短路径(All Pairs Shortest Path,APSP):
一般来说,多源最短路径的求法为floyed。
floyed即为一个三维上的动态规划。
我们先引出最短路径的三角公式:
三角不等式:dist[p1][p2]<=dist[p1][p3]+dist[p3][p2]
可以结合下面的图想一下:
所有点对间最短路径的问题是指以图G=(V,E)为对象,求G中每个点之间的最短路径问题。
在解决APSP问题上,复杂度为O(V^3)的floyed算法广为人知。
for(int k=1;k<=N;k++){
for(int i=1;i<=N;i++){
for(int j=1;j<=N;j++){
map[i][j]=min(map[i][j],map[i][k]+map[k][j]);//求出所有点对间最短路径
}
}
}
该算法需要注意map的初始值以及map[i][k]+map[k][j]的溢出问题。
下面给出一个精妙的例题:
N个城市,每个城市有一匹马。第i座城市的马最多走Ei的距离,它的速度是
Si。第i座城市到第j座城市直接道路的长度为Dij,若Dij = −