一张图 · 一个矩阵 · 三重循环 —— 把全源最短路写到闭眼也不会错。
求任意两点之间的最短路(全源最短路)。n≤100,正是 Floyd 的主场:
三重循环 k → i → j,每次问一句“经过 k 中转会不会更近”。
本节只做一件事:让丁把这 6 行循环默写出来。
重点不是难度,而是把「k 必须在最外层」刻进肌肉记忆。
最外层的 k 表示:“现在允许借用第 k 个点当中转站”。
当 k 从 1 数到 n,每个点都轮流“开放”成中转站一次,
dist[i][j] 就逐步考虑了所有可能的绕路 —— 最终一定是真正的最短路。
dist[i][j] = min( dist[i][j], dist[i][k] + dist[k][j] );
样例:4 个点的环 1-2-3-4-1,每条边权 1。∞ 表示暂时走不通。
Q1. 三重循环里,哪个变量必须放在最外层?
Q2. 题目说“可能有重边”,读入时应该怎么处理同一对点的多条边?
Q3. 把 INF 设成 INT_MAX 可能出什么问题?
| 1 | 2 | 3 | 4 | |
|---|---|---|---|---|
| 1 | 0 | 1 | 2 | 1 |
| 2 | 1 | 0 | 1 | 2 |
| 3 | 2 | 1 | 0 | 1 |
| 4 | 1 | 2 | 1 | 0 |
0x3f3f3f3f 这种“加法不溢出”的值。min 保留最短的一条。k 最外、i,j 在内 —— 这是全题唯一的“死规定”。or/and,对照着写。k 含义后的经典进阶题。