1 解决的问题
从某一点到达任意一点的最短距离,任意两个节点之间的最短距离
来源https://blog.youkuaiyun.com/shezjoe/article/details/80670188
2 思想
找一个中间点,经过中间点的距离与不经过中间点的距离是不是更小
例如: 1 -> 3
不经过中间点 d13 = 6
加入经过2,d12 + d23 = 2 + 3 =5 < d13
所以经过2比d13更好点,可能会有更好的中间点,这就需要遍历每一个顶点
3 代码实现
核心代码
利用动态规划
for k in range(n):
for i in range(n):
for j in range(n):
if(dp[i][k]+dp[j][k] < dp[i][j]):
dp[i][j] = dp[i][k]+dp[j][k]
4 与迪杰斯特拉算法的区别
感觉迪杰斯特拉算法也用了中间点连接,但不是用所有的,有选择性的使用
1.Floyd算法是求任意两点之间的距离,是多源最短路,而Dijkstra(迪杰斯特拉)算法是求一个顶点到其他所有顶点的最短路径,是单源最短路。
2.Floyd算法可以算带负权的,而Dijkstra(迪杰斯特拉)算法是不可