Floyd算法仅仅5行代码找到最短路径令人惊讶,这篇博客讲的很好,直击要害。下面我再整理一下思路,说说我对文中那个“致命的结论”的理解。
假设图中有N个节点,编号为1, 2, ..., N。
- 循环开始前,某些节点对之间的最短路径已经确定,就是一跳直连。
- 循环开始,考虑以节点1为中间节点,即k=1。假设i到j之间的最短路径上,编号最大的是1(除了i和j),那么也一定只有一个1了,而且i到1以及1到j的最短路径一定也已经确定,就是上一步中那些直连的。因此,d[i][j]也就更新为最短的了。
- k=2。假设i到j(另一对i和j)之间的最短路径上,编号最大的是2(除了i和j),那么这条路上也可能还有一个1。i到2之间最短路径上编号最大的一定小于2,2到j之间最短路径上编号最大的也一定小于2,而这些子路径在前两步已经确定,因此,d[i][j]可以更新为最短。
- k=3,同理。
本文深入解析Floyd算法,仅用5行代码实现最短路径查找。通过逐步讲解,理解循环过程中如何确保每一步更新的路径都是最短的。适合算法初学者及进阶者阅读。
3万+





