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,同理。